Android屏蔽Home按键

来源:互联网 发布:c 开发 gprs源码 编辑:程序博客网 时间:2024/05/21 10:46
Android屏蔽Home按键
一、前提条件
1.1 有整套系统源码以及对应测试机器
1.2 在Linux系统下进行开发

二、实现效果
2.1 在某个APP使用Home键无效,无法退出应用程序。

三、修改代码原理简述
2.1 想要屏蔽Home按键必须在Framework层中进行处理,Application层无法进行真正的拦截操作。应用之间数据共享采用ContentProvider方式。

四、APP端修改
4.1 调用接口如图:

    @Override    protected void onResume() {        super.onResume();        Settings.Global.putInt(getContentResolver(), "home_keypad", 1);    }
    @Override    protected void onPause() {        super.onPause();        Settings.Global.putInt(getContentResolver(), "home_keypad", 0);    }
4.2 参数说明:
4.2.1 getContentResolver() 获取实例;
4.2.2 home_keypad Global数据库的列,如果没有这个列将会添加;
4.2.3 0 or 1 判断开启Home键屏蔽flag标志位;

五、Framework层修改
修改路径:
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
frameworks/base/core/java/android/provider/Settings.java

5.1 添加Settings.Global.HOME_KEYPAD常量值,表示数据库中的列
public static final String HOME_KEYPAD = "home_keypad";

5.2 添加全局变量
int mHomeKeypadShield;

5.3 注册ContentObserver实时监听数据库变化
在PhoneWindowManager.java里面的SettingsObserver进行注册一下,我们可以看到它继承了ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化时做一些相应的处理。(PS: ...代表中间省略了代码)
class SettingsObserver extends ContentObserver {        SettingsObserver(Handler handler) {            super(handler);        }        void observe() {              ...      resolver.registerContentObserver(Settings.Global.getUriFor(              Settings.Global.HOME_KEYPAD), false, this,              UserHandle.USER_ALL);              updateSettings();}}

5.4 获取数据库的值赋值给全局变量
public void updateSettings() {        ContentResolver resolver = mContext.getContentResolver();        boolean updateRotation = false;        synchronized (mLock) {            mHomeKeypadShield = Settings.Global.getIntForUser(resolver,            Settings.Global.HOME_KEYPAD, 0, UserHandle.USER_CURRENT);    ...}}
这个函数也就是SettingsObserver最后一行调用的,思路一看就明白。

5.5 按键必须走的函数,不管是Back键还是应用切换键。顾名思义interceptKeyBeforeDispatching拦截按键之前分发。当return -1的时候说明按键事件已经处理完毕,所以我们在APP开始启动时将数据库的值写为1,监听数据库的值为1的时候就return 0出去,代表按键不做处理。APP端退出的时候又写为0,不影响整个Home按键操作。
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {...if (keyCode == KeyEvent.KEYCODE_HOME) {            if (1 == mHomeKeypadShield) {               return 0;            }   ...   return -1;} ...}
1 0
原创粉丝点击