方法一:android 4.0以后无法通过更改页面的类型来监听home键了。如果不改源码的情况下,下面的方式可以很好的监听到home键(前提是手机打系统日志,有些手机日志被关闭了(如华为荣耀)就无法监听了)。
01 | protected void onResume() |
05 | new CatchLogThread().start(); |
07 | class CatchLogThread extends Thread { |
10 | Process mLogcatProc = null ; |
11 | BufferedReader reader = null ; |
16 | mLogcatProc = Runtime.getRuntime().exec( new String[] { "logcat" , "ActivityManager:I *:S" }); |
17 | reader = new BufferedReader( new InputStreamReader(mLogcatProc.getInputStream()), 2 * 1024 ); |
18 | while ((line = reader.readLine()) != null ) { |
19 | if (line.indexOf( "android.intent.category.HOME" ) > 0 ) { |
21 | System.out.println( "DDDDDDDDDDDDDDDDDDDDDDDDD" ); |
22 | handler.sendMessage(handler.obtainMessage()); |
23 | Runtime.getRuntime().exec( "logcat -c" ); |
33 | Handler handler = new Handler() { |
34 | public void handleMessage(android.os.Message msg) { |
36 | startActivity( new Intent(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+++++++++++++++++" ); |
最后记得在AndroidManifest.xml中加读取日志权限:
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
方法二:广播监听
view source print ?
01 | private final BroadcastReceiver homePressReceiver = new BroadcastReceiver() { |
02 | final String SYSTEM_DIALOG_REASON_KEY = "reason" ; |
03 | final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey" ; |
06 | public void onReceive(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); |
11 | && reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { |
13 | Log.i(TAG, "home_press" ); |
注册广播:
1 | IntentFilter homeFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); |
2 | registerReceiver(homePressReceiver, homeFilter); |
注销广播:
view source print ?
1 | if (homePressReceiver != null ) { |
3 | unregisterReceiver(homePressReceiver); |
6 | "unregisterReceiver homePressReceiver failure :" |
方法三:在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");
}
}
}
}
- android TextView 的setTextSize方法的使用
- Android Drawer(抽屜)的使用(二)常用的方法:
- Android 退出应用程序的实现方法
- 关于Android LinearLayout添加分隔线的方法
- Android ScrollView初始位置不在顶部的解决方法
- Android事件模型
- 解决Android横竖屏切换数据丢失问题的方法
- 浅谈Android 的事件分发机制
随机推荐
-
在php中获取引荐来源网址(包括参数)
-
php隔两行换色
-
ThinkPHP3.2.3框架下where的组合查询and
-
关于uoloadify不能显示效果原因(thinkphp
-
PHP 常见的数据加密技术
-
如何从0-X的PHP中获得一个加密的强整数?
-
PHP 使用 OSS 批量上传图片
-
PHP 5.0 到 7.1 常用语法糖(个人整理)
-
PHP基础 文件流
-
使用wamp扩展php时出现服务未启动的解决