方法一:android 4.0以后无法通过更改页面的类型来监听home键了。如果不改源码的情况下,下面的方式可以很好的监听到home键(前提是手机打系统日志,有些手机日志被关闭了(如华为荣耀)就无法监听了)。

01 protectedvoidonResume()
02 {
03 super.onResume();
04 isTesting=true;
05 newCatchLogThread().start();
06 }
07 classCatchLogThreadextendsThread {
08 @Override
09 publicvoidrun() {
10 Process mLogcatProc =null;
11 BufferedReader reader =null;
12 String line;
13 while(isTesting) {
14 try{
15 // 获取logcat日志信息
16 mLogcatProc = Runtime.getRuntime().exec(newString[] {"logcat","ActivityManager:I *:S"});
17 reader =newBufferedReader(newInputStreamReader(mLogcatProc.getInputStream()),2*1024);
18 while((line = reader.readLine()) !=null) {
19 if(line.indexOf("android.intent.category.HOME") >0) {
20 isTesting =false;
21 System.out.println("DDDDDDDDDDDDDDDDDDDDDDDDD");
22 handler.sendMessage(handler.obtainMessage());
23 Runtime.getRuntime().exec("logcat -c");//删除日志
24 break;
25 }
26 }
27 }catch(Exception e) {
28 e.printStackTrace();
29 }
30 }
31 }
32 };
33 Handler handler =newHandler() {
34 publicvoidhandleMessage(android.os.Message msg) {
35
36 startActivity(newIntent(MainActivity.this,MainActivity.class));
37 Toast.makeText(MainActivity.this,"I Have Home is pressed!!!!!",Toast.LENGTH_LONG).show();
38 System.out.println("Home is Pressed+++++++++++++++++");
39 };
40 };



最后记得在AndroidManifest.xml中加读取日志权限:
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>

方法二:广播监听

view source print ?
01 privatefinalBroadcastReceiver homePressReceiver =newBroadcastReceiver() {
02 finalString SYSTEM_DIALOG_REASON_KEY ="reason";
03 finalString SYSTEM_DIALOG_REASON_HOME_KEY ="homekey";
04
05 @Override
06 publicvoidonReceive(Context context, Intent intent) {
07 String action = intent.getAction();
08 if(action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
09 String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
10 if(reason !=null
11 && reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
12 // 自己随意控制程序,写自己想要的结果
13 Log.i(TAG,"home_press");
14
15 }
16 }
17 }
18 };

注册广播:

1 IntentFilter homeFilter =newIntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
2 registerReceiver(homePressReceiver, homeFilter);



注销广播:

view source print ?
1 if(homePressReceiver !=null) {
2 try{
3 unregisterReceiver(homePressReceiver);
4 }catch(Exception e) {
5 Log.e(TAG,
6 "unregisterReceiver homePressReceiver failure :"
7 + e.getCause());
8 }
9 }


方法三:在android2.2到android3.2使用:一下代码就可以截取HOME事件:

1.publicvoidonAttachedToWindow()

2.{

3.this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

4.super.onAttachedToWindow();

5.}

AndroidManifest.xml里面加上权限<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/>

好了,这样子就可以截取HOME事件了。

但是在android4.0上面,使用如下代码,就会报错:

错误信息如下:

java.lang.IllegalArgumentException: Window type can not be changedafter the window is added.

方法四:监听HOME事件

想不到啊,想不到,android4.0上面居然还有监听HOME事件的。其实也不是仅仅监听HOME事件的,他监听的是,activity离开的事件:

所以只需要重写activity下面的:就可以监听咯

@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
System.out.println("onUserLeaveHint");

}

团队的项目解决就用了一个比较213的方法,就是当判断用户是点击HOME的离开事件之后,添加这写语句:

Intent intent = new Intent(this,还是这个ACTIVITY的类名.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
this.startActivity(intent);

/**
* 判断应用是否有活跃的activity
*/
public boolean isActive()
{
ActivityManager mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);
return rti.get(0).topActivity.getPackageName().contains(getPackageName());
}

--------------------------------------------------------------------------

public class HomeWatcherReceiver extends BroadcastReceiver {
private static final String LOG_TAG = "HomeReceiver";
private static final String SYSTEM_DIALOG_REASON_KEY = "reason";
private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
private static final String SYSTEM_DIALOG_REASON_LOCK = "lock";
private static final String SYSTEM_DIALOG_REASON_ASSIST = "assist";

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(LOG_TAG, "onReceive: action: " + action);
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
// android.intent.action.CLOSE_SYSTEM_DIALOGS
String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
Log.i(LOG_TAG, "reason: " + reason);

if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) {
// 短按Home键
Log.i(LOG_TAG, "homekey");

}
else if (SYSTEM_DIALOG_REASON_RECENT_APPS.equals(reason)) {
// 长按Home键 或者 activity切换键
Log.i(LOG_TAG, "long press home key or activity switch");

}
else if (SYSTEM_DIALOG_REASON_LOCK.equals(reason)) {
// 锁屏
Log.i(LOG_TAG, "lock");
}
else if (SYSTEM_DIALOG_REASON_ASSIST.equals(reason)) {
// samsung 长按Home键
Log.i(LOG_TAG, "assist");
}

}
}

}

更多相关文章

  1. android TextView 的setTextSize方法的使用
  2. Android Drawer(抽屜)的使用(二)常用的方法:
  3. Android 退出应用程序的实现方法
  4. 关于Android LinearLayout添加分隔线的方法
  5. Android ScrollView初始位置不在顶部的解决方法
  6. Android事件模型
  7. 解决Android横竖屏切换数据丢失问题的方法
  8. 浅谈Android 的事件分发机制

随机推荐

  1. 在php中获取引荐来源网址(包括参数)
  2. php隔两行换色
  3. ThinkPHP3.2.3框架下where的组合查询and
  4. 关于uoloadify不能显示效果原因(thinkphp
  5. PHP 常见的数据加密技术
  6. 如何从0-X的PHP中获得一个加密的强整数?
  7. PHP 使用 OSS 批量上传图片
  8. PHP 5.0 到 7.1 常用语法糖(个人整理)
  9. PHP基础 文件流
  10. 使用wamp扩展php时出现服务未启动的解决