方法一: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" );
|
27 |
} catch (Exception e) {
|
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>
方法二:广播监听
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);
|
注销广播:
1 |
if (homePressReceiver != null ) {
|
3 |
unregisterReceiver(homePressReceiver);
|
4 |
} catch (Exception e) {
|
6 |
"unregisterReceiver homePressReceiver failure :"
|
方法三:在android2.2到android3.2使用:一下代码就可以截取HOME事件:
1. public void onAttachedToWindow()
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编译大全_完全指南
《Google Android SDK开发范例大全(第3版)》内容由Android的基础知识到实际开发应用,结构清晰、语言简洁,非常适合Android的初学者和Android的进阶程序开发者阅读参考。 编辑本段 编辑推荐 《Google Android SDK...
《Google Android SDK开发范例大全(第3版)》内容由Android的基础知识到实际开发应用,结构清晰、语言简洁,非常适合Android的初学者和Android的进阶程序开发者阅读参考。 编辑本段 编辑推荐 《Google Android SDK...
《Google Android SDK开发范例大全(第3版)》内容由Android的基础知识到实际开发应用,结构清晰、语言简洁,非常适合Android的初学者和Android的进阶程序开发者阅读参考。 编辑本段 编辑推荐 《Google Android SDK...
《Google Android SDK开发范例大全(第3版)》内容由Android的基础知识到实际开发应用,结构清晰、语言简洁,非常适合Android的初学者和Android的进阶程序开发者阅读参考。 编辑本段 编辑推荐 《Google Android SDK...
Android_Home.rar Android之GPS定位.zip Android代码调用C++代码和C++代码调用Android代码.zip android写的google map api 应用.rar android基于自定义适配器的ExpandableListView.zip Android无线点餐系统.rar ...
linux常用命令大全 1.Linux管理文件和目录的命令 命令 功能 命令 功能 Pwd 显示当前目录 ls 查看目录下的内容 Cd 改变所在目录 cat 显示文件的内容 Grep 在文件中查找某字符 cp 复制文件 Touch 创建文件 mv 移动...
1.3.7. 启动 Home Laucher ............... 19 第 2 章 第二章 ................... 21 2.1. Activity 的架构设计 ....................... 21 2.1.1. 概述 ........................................ 21 2.1.2. ...
助手java源码大全该项目是 libgdx 的增强型 gradle 配置 特征 解耦项目 - 在 android 项目上工作时,你不会看到 gradle 用仅用于 iOS 的 RoboVM 做一些事情。 所以更好的性能和稳定性 带有 lambda 的 Java 8 支持...
这是我使用的汇总的快速样板。 您需要按照提供的大小制作自己的启动器图标。 至少,提供 192x192 版本。 您可以更改 HTML 中的theme-color元标记,这将控制在 Android 5+ 上启动启动器时的标题栏颜色。 ##...