Android屏蔽Home按键
16lz
2021-01-25
Android屏蔽Home按键
一、前提条件
1.1 有整套系统源码以及对应测试机器 1.2 在Linux系统下进行开发
二、实现效果 2.1 在某个APP使用Home键无效,无法退出应用程序。
三、修改代码原理简述
2.1 想要屏蔽Home按键必须在Framework层中进行处理,Application层无法进行真正的拦截操作。应用之间数据共享采用ContentProvider方式。
四、APP端修改 4.1 调用接口如图:
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常量值,表示数据库中的列
5.2 添加全局变量
5.3 注册ContentObserver实时监听数据库变化 在PhoneWindowManager.java里面的SettingsObserver进行注册一下,我们可以看到它继承了ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化时做一些相应的处理。(PS: ...代表中间省略了代码)
5.4 获取数据库的值赋值给全局变量
5.5 按键必须走的函数,不管是Back键还是应用切换键。顾名思义interceptKeyBeforeDispatching拦截按键之前分发。当return -1的时候说明按键事件已经处理完毕,所以我们在APP开始启动时将数据库的值写为1,监听数据库的值为1的时候就return 0出去,代表按键不做处理。APP端退出的时候又写为0,不影响整个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] SQLite数据库之增删改查基础操作
- android SQLite使用SQLiteOpenHelper类对数据库进行操作
- Android(安卓)按键事件处理详解
- Android(安卓)小米盒子游戏手柄按键捕获 - 能获取到的 home 键依
- eoe源码阅读(一)
- Android如何导入已有的外部数据库(在raw下自己导入db文件)
- Android(安卓)SQLite 开发教程(2): android.database.sqlite 类
- Android应用优化(7)数据库操作
- Android如何连接MySQL数据库