Android HOME键,BACK键的捕获与响应
来源:互联网 发布:查重率软件paperrater 编辑:程序博客网 时间:2024/05/17 22:51
1.onUserLeaveHint
相比主页键(HOME)和最近应用键(APP_SWITCH)的处理,返回键比较简单,复写onKeyDown就可以实现,如下:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // KeyEvent.KEYCODE_HOME KeyEvent.KEYCODE_APP_SWITCH if (keyCode == KeyEvent.KEYCODE_BACK) { exitAction(); return true; } else return super.onKeyDown(keyCode, event); }
HOME和APP_SWITCH比较复杂,尤其是HOME键,如果不特殊设置,有可能会被恶意应用利用。所以即使是处理了HOME键,实测会首先进入Launcher,一段时间后才会执行我们的操作,想必这也是系统层从安全角度的考量,有时间看一下系统源码。
尝试过多种方式之后,复写onUserLeaveHint函数比较便捷,如下即可:
@Override protected void onUserLeaveHint() { //super.onUserLeaveHint(); exitAction(); }
把操作写在了exitAction函数中,这里以启动设置为例:
private void exitAction() { try { Intent intent = new Intent(); ComponentName componentName = new ComponentName("com.android.settings", "com.android.settings.Settings"); intent.setComponent(componentName); startActivity(intent); } catch (Exception e) { e.printStackTrace(); } }
2.DISABLE_KEYGUARD
AndroidManifest.xml加权限:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
Activity处理:
public class Main extends Activity { public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED); setContentView(R.layout.main); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // KeyEvent.KEYCODE_HOME KeyEvent.KEYCODE_APP_SWITCH if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) return true; else return super.onKeyDown(keyCode, event); }}
3.Frameworks源码修改
Android中的Home Key,Power Key默认都是由系统的Framework来响应,如果想让自己的应用捕获响应,该怎么做呢?
Home Key比较简单,不涉及系统源码修改:
getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);
- 重写此 main Activity 的 onKeyDown() 方法, 实现 home key 的处理部分, 并
return true;
Power Key稍微麻烦一些,要修改源码:
1: 修改 phoneWindowManager.java 的 interceptKeyBeforeQueueing 方法,在参考行后加入:
case KeyEvent.KEYCODE_POWER: { // 参考行result &= ~ACTION_PASS_TO_USER; // 参考行// add beginActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);try{if (activityManager.getRunningTasks(1).get(0).topActivity.getPackageName().equals("your_special_package_name")){//Please reset the special package name.result |= ACTION_PASS_TO_USER;Xlog.d(TAG,"detect power key in special package, pass to user!")}}catch(NullPointerException e){Xlog.d(TAG,"ingore a NullPointerException ..");}//add end
2: 同样在此分支内, 找到 else 语句段, 并找到如下位置加入
if (interceptPowerKeyUp(canceled || mPendingPowerKeyUpCanceled)) { // 参考行if(!((result& ACTION_PASS_TO_USER) == ACTION_PASS_TO_USER)){ //加入行result = (result & ~ACTION_WAKE_UP) | ACTION_GO_TO_SLEEP; //原有代码}}//加入行
周木水的CSDN博客
0 0
- Android HOME键,BACK键的捕获与响应
- Android HOME键,BACK键的捕获与响应
- android back和home键的捕获
- android back和home键的捕获
- [Android] Android 物理键点击响应 Menu Home Back 键点击捕获
- Android中Back键与Home键的区别
- Android中Back键与Home键的区别
- Android -- home键与back键对activity的影响
- Android Back键与Home键的监听
- android捕获back键
- 浅析WPhone、Android的Back与Home键
- Back 键与Home键的区别
- android 手机的back键home键
- back键的捕获
- Android对home back键的监听
- android 捕获home键
- android捕获home键
- Android捕获home键
- 软件测试人员一般要经历的几个阶段
- android读取大图片并缓存
- 如何修改WampServer的Apache端口号和IIS的端口号
- Redis主从监控,故障自动切换
- 2014信息检索大赛项目回顾(上)
- Android HOME键,BACK键的捕获与响应
- 大数据实时处理–Spark及BDAS技术应用
- iOS获取当前时间
- 网页设计常见问题
- greenplum4.3.4单机安装
- GetWindowRect和GetClientRect的区别详解
- Android轻量级的开源缓存框架ASimpleCache
- 【凯子哥带你夯实应用层】使用ActionMode实现有删除动画的多选删除功能
- [蜂鸣器不简单]单片机中蜂鸣器的多种运用(长响,短响,多次响)