方法一: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开发知识点汇总”和描述中提到的一些重要技术点的详细解析: 1. **知识库.txt**: 这个文件可能包含了Android开发的基础知识,如组件生命周期、布局管理、数据存储、网络请求、多线程处理等...
Android Studio作为一款流行的Android应用开发环境,其快捷键是提高开发效率的重要工具。快捷键的使用可以帮助开发者快速完成编码、调试等任务,减少鼠标操作的繁琐性。以下是从给定文件中提炼出的关于Android ...
### Android编译大全_完全指南 #### 知识点概览 1. **编译环境的搭建** - Ubuntu 9.10 虚拟机的构建与配置 - 必需软件包的安装 2. **Sourcecode的获取** - 使用`repo`工具初始化并同步代码库 3. **编译源代码**...
Android源码编译make错误解决方案汇总 Android源码编译make过程中经常会遇到各种错误,这篇文章将总结各种常见错误的解决方案。 错误一:Java版本不正确 编译Android源码时,make命令可能会报错,提示您使用了...
InputManagerService是Android系统服务之一,负责处理设备输入事件,如键盘、触摸屏等。它负责注册、管理和分发这些输入事件给相应的窗口或应用程序,确保用户交互的正确处理。 2. **Android系统启动流程**: ...
然而,这个配置还不够,因为我们还需要添加两个 category:`android.intent.category.HOME` 和 `android.intent.category.DEFAULT`。这两个 category 是 Launcher 的必备配置,用于指定该 Activity 是一个桌面应用...
### Android XML 属性详解 #### 一、概览 在Android开发中,XML文件用于定义应用界面布局和其他配置信息。为了更好地控制应用的行为和外观,开发者可以利用一系列强大的XML属性来定制自己的应用。本文将详细介绍...
Android 系统编译过程中常见问题汇总 Android 系统编译过程中常见问题汇总是指在编译 Android 系统时可能遇到的各种问题以及解决方法。下面是七个常见问题的解决方案: 1. 问题一:/bin/bash: bison: 未找到命令 ...
"Android Studio快捷键开发大全"是一个专注于介绍和掌握这些快捷键的学习资源,旨在帮助开发者更加熟练地使用这个强大的集成开发环境(IDE)。 Android Studio基于IntelliJ IDEA,因此其快捷键系统与IntelliJ IDEA...
Android_Home.rar Android之GPS定位.zip Android代码调用C++代码和C++代码调用Android代码.zip android写的google map api 应用.rar android基于自定义适配器的ExpandableListView.zip Android无线点餐系统.rar ...
【Android常用知识点汇总】 在Android开发中,经常会遇到各种各样的问题,以下是一些关键知识点的总结,旨在帮助开发者快速解决常见问题。 1. **去除GridView、ListView的默认背景**:可以通过自定义Item布局,...
- 需要在系统的环境变量中配置`JAVA_HOME`和`ANDROID_HOME`,以便其他工具能够识别这些路径。 ### 三、Android应用基础 #### 1. Activity生命周期 - Android中的Activity代表了一个屏幕界面,每个Activity都有...
### Android Studio 快捷键大全 #### 一、概述 Android Studio是Google为Android开发提供的官方集成开发环境(IDE)。为了提高工作效率,掌握其内置的快捷键是非常必要的。本文将详细介绍Android Studio中常用的...
除了以上提到的,Android还有很多其他的动作、广播和类别,它们共同构建了一个丰富的交互模型,使得开发者可以响应各种系统事件,实现不同应用间的协同工作。理解并熟练运用这些标识是开发Android应用的基础,也是...
### Android Activity和Task的启动模式 #### 1. Standard - **定义**: 每次启动一个新的Activity时,系统都会创建一个新的实例,并将其压入任务栈的顶部。 - **特点**: - 每个任务都可以有多个Activity实例。 - ...
在安装SDK时,需要添加JAVA_HOME变量,路径为JDK目录。然后,打开Android SDK Manager,选择要安装的Android版本,并安装相应的SDK包。 在IDE中,创建一个新项目,选择Android Application模块,并选择要使用的SDK...