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. [Android] SQLite数据库之增删改查基础操作
  2. android SQLite使用SQLiteOpenHelper类对数据库进行操作
  3. Android(安卓)按键事件处理详解
  4. Android(安卓)小米盒子游戏手柄按键捕获 - 能获取到的 home 键依
  5. eoe源码阅读(一)
  6. Android如何导入已有的外部数据库(在raw下自己导入db文件)
  7. Android(安卓)SQLite 开发教程(2): android.database.sqlite 类
  8. Android应用优化(7)数据库操作
  9. Android如何连接MySQL数据库

随机推荐

  1. 相对布局中的一些常用属性
  2. 2013.09.05——— android 蓝牙聊天室之
  3. android 收到SMS操作总结
  4. Android(安卓)布局----让一个控件居底部
  5. Android检测SD卡是否可用,Android获取磁盘
  6. android textview 跑马灯 滚动效果
  7. 自定义android RadioPreference组件
  8. Android(安卓)EditText 的 android:imeOp
  9. RelativeLayout用到的一些重要的属性
  10. Android布局的一些属性值