`

android Home事件汇总

 
阅读更多

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

01 protected void onResume()
02     {
03         super.onResume();
04         isTesting=true;
05         new CatchLogThread().start();
06     }
07 class CatchLogThread extends Thread {  
08      @Override  
09       public void run() {  
10           Process mLogcatProc = null;  
11           BufferedReader reader = null;  
12            String line;  
13            while (isTesting) {  
14                try {  
15                  // 获取logcat日志信息   
16                    mLogcatProc = Runtime.getRuntime().exec(new String[] { "logcat","ActivityManager:I *:S" });  
17                    reader = new BufferedReader(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 = new Handler() {  
34        public void handleMessage(android.os.Message msg) {
35             
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+++++++++++++++++");
39         };   
40    };  



最后记得在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";
04  
05                 @Override
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);
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 = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
2                 registerReceiver(homePressReceiver, homeFilter);



注销广播:

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.  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开发知识点汇总

    以下是对标题“android开发知识点汇总”和描述中提到的一些重要技术点的详细解析: 1. **知识库.txt**: 这个文件可能包含了Android开发的基础知识,如组件生命周期、布局管理、数据存储、网络请求、多线程处理等...

    Android Studio 快捷键大全 中文版

    Android Studio作为一款流行的Android应用开发环境,其快捷键是提高开发效率的重要工具。快捷键的使用可以帮助开发者快速完成编码、调试等任务,减少鼠标操作的繁琐性。以下是从给定文件中提炼出的关于Android ...

    android编译大全_完全指南

    ### Android编译大全_完全指南 #### 知识点概览 1. **编译环境的搭建** - Ubuntu 9.10 虚拟机的构建与配置 - 必需软件包的安装 2. **Sourcecode的获取** - 使用`repo`工具初始化并同步代码库 3. **编译源代码**...

    Android源码编译make的各类错误解决方案汇总

    Android源码编译make错误解决方案汇总 Android源码编译make过程中经常会遇到各种错误,这篇文章将总结各种常见错误的解决方案。 错误一:Java版本不正确 编译Android源码时,make命令可能会报错,提示您使用了...

    Android常见面试题目汇总以及答案

    InputManagerService是Android系统服务之一,负责处理设备输入事件,如键盘、触摸屏等。它负责注册、管理和分发这些输入事件给相应的窗口或应用程序,确保用户交互的正确处理。 2. **Android系统启动流程**: ...

    android手把手教你开发launcher.pdf

    然而,这个配置还不够,因为我们还需要添加两个 category:`android.intent.category.HOME` 和 `android.intent.category.DEFAULT`。这两个 category 是 Launcher 的必备配置,用于指定该 Activity 是一个桌面应用...

    Android_XML属性大全

    ### Android XML 属性详解 #### 一、概览 在Android开发中,XML文件用于定义应用界面布局和其他配置信息。为了更好地控制应用的行为和外观,开发者可以利用一系列强大的XML属性来定制自己的应用。本文将详细介绍...

    Android系统编译过程中常见问题汇总

    Android 系统编译过程中常见问题汇总 Android 系统编译过程中常见问题汇总是指在编译 Android 系统时可能遇到的各种问题以及解决方法。下面是七个常见问题的解决方案: 1. 问题一:/bin/bash: bison: 未找到命令 ...

    android Studio快捷键开发大全

    "Android Studio快捷键开发大全"是一个专注于介绍和掌握这些快捷键的学习资源,旨在帮助开发者更加熟练地使用这个强大的集成开发环境(IDE)。 Android Studio基于IntelliJ IDEA,因此其快捷键系统与IntelliJ IDEA...

    android上百例精品实例源码(非常值得下载)收藏

    Android_Home.rar Android之GPS定位.zip Android代码调用C++代码和C++代码调用Android代码.zip android写的google map api 应用.rar android基于自定义适配器的ExpandableListView.zip Android无线点餐系统.rar ...

    Android常用知识点汇总

    【Android常用知识点汇总】 在Android开发中,经常会遇到各种各样的问题,以下是一些关键知识点的总结,旨在帮助开发者快速解决常见问题。 1. **去除GridView、ListView的默认背景**:可以通过自定义Item布局,...

    Google Android SDK开发范例大全.pdf 高清下载

    - 需要在系统的环境变量中配置`JAVA_HOME`和`ANDROID_HOME`,以便其他工具能够识别这些路径。 ### 三、Android应用基础 #### 1. Activity生命周期 - Android中的Activity代表了一个屏幕界面,每个Activity都有...

    android studio快捷键大全

    ### Android Studio 快捷键大全 #### 一、概述 Android Studio是Google为Android开发提供的官方集成开发环境(IDE)。为了提高工作效率,掌握其内置的快捷键是非常必要的。本文将详细介绍Android Studio中常用的...

    Android_的动作、广播、类别等标识大全.doc

    除了以上提到的,Android还有很多其他的动作、广播和类别,它们共同构建了一个丰富的交互模型,使得开发者可以响应各种系统事件,实现不同应用间的协同工作。理解并熟练运用这些标识是开发Android应用的基础,也是...

    2012android面试大全

    ### Android Activity和Task的启动模式 #### 1. Standard - **定义**: 每次启动一个新的Activity时,系统都会创建一个新的实例,并将其压入任务栈的顶部。 - **特点**: - 每个任务都可以有多个Activity实例。 - ...

    AndroidAPP开发入门教程.pdf

    在安装SDK时,需要添加JAVA_HOME变量,路径为JDK目录。然后,打开Android SDK Manager,选择要安装的Android版本,并安装相应的SDK包。 在IDE中,创建一个新项目,选择Android Application模块,并选择要使用的SDK...

Global site tag (gtag.js) - Google Analytics