Android屏蔽Home按键

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;
	}
	 ...
}

你可能感兴趣的:(Android系统应用)