1.onUserLeaveHint

相比Home键(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);
  1. 重写此 main Activity 的 onKeyDown() 方法, 实现 home key 的处理部分, 并
return true;

Power Key略微麻烦一些。要改动源代码:

1: 改动 phoneWindowManager.java 的 interceptKeyBeforeQueueing 方法,在參考行后增加:

case KeyEvent.KEYCODE_POWER: { // 參考行
result &= ~ACTION_PASS_TO_USER; // 參考行
// add begin
ActivityManager 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博客

版权声明:原创文章,转载请注明出处:http://blog.csdn.net/zhoumushui

最新文章

  1. Sonar规则学习笔记
  2. python numpy 介绍
  3. Eclipse为Unity3d编写jar组件
  4. Linux下安装配置Nexus
  5. angular js一探
  6. Pad控件 UIPopoverController的介绍与使用(Pad的专属菜单控件、Swift版本)
  7. 利用Struts拦截器限制上传图片的格式和大小
  8. Sql Server中的数据类型和Mysql中的数据类型的对应关系(转)
  9. monit官方摘录
  10. loadrunner&#160;脚本开发-int型变量和字符串的相互转换
  11. spingboot @EnableScheduling
  12. 第十二周(12.01-12.04)----final评论I
  13. 【Spark】SparkStreaming-Kafka-Redis-集成-基础参考资料
  14. CCF 工资计算
  15. 场景设计以及Manual Scenario和Goal-OrientedScenario的区别
  16. 是否应该开启WebView硬件加速?
  17. SQL SERVER技术内幕之8 分组集
  18. FZU 2122 ——又见LKity——————【KMP字符串匹配】
  19. PHP通过copy()函数来复制一个文件
  20. Linux 查看某个程序所在端口的 PID

热门文章

  1. mvc中使用jsonp进行跨域请求详细说明
  2. OD: Shellcode / Exploit &amp; DLL Trampolining
  3. (转)ASP.NET版本的Kindeditor插件的使用(同步)
  4. AngularJs练习Demo16 ngRoute
  5. 基于java callable及future接口解决生产者消费者问题
  6. iOS基础框架的搭建 / 及国际化操作
  7. shell中的eval
  8. Hibernate插入数据效率测试
  9. 利用css进行网页布局
  10. C++ 的多重继承