另辟思路解决 Android 4.0.4 不能监听Home键的问题

问题描述:

  自从Android 4.0以后,开发人员是不能监听和屏蔽Home键的,对于KEYCODE_HOME,官方给出的描述如下:

Home key. This key is handled by the framework and is never delivered to applications.

所以,除非修改Framework,都不能直接监听Home键了,网上有朋友说监听Log日志,但是现在按Home键是不显示Log日志的,而且不同的手机型号即使显示也不会一样。

  在网上找了好多方法都没有解决……无奈啊。

  为了实现用户按了Home键之后处理事件,被逼的另辟蹊径 使用下面的解决方案了。

解决方案:

  1.思路

    Activity的生命周期中,

    

    每一个Activity在启动的时候都要走(执行)OnResume()方法,而且,每一个Activity在被结束的时候都要走OnStop方法,并且,用户在按Home键之后Activity也是要执行Onstop()方法(看图,图上说Activity不可见的时候就执行)。

    所以,我们可以在每一个Activity的OnStop()方法中,判断一下所有的Activity的状态,如果所有的Activity都不可见的时候(都执行过OnStop()),执行我们想要做的操作。

  2.逻辑

    自定义Application,在其中定义一个全局的HashMap,定义两个方法,方法一addActivityStatus(Activity activity)用来管理Activity的状态,方法二 isAllActivityAlive()用来查询是否所有的Activity都处于激活状态。

    在每一个Activity中的OnResume()方法中,调用addActivityStatus(Activity activity)把当前的Activity的状态设置为true激活状态,在OnStop()方法先调用addActivityStatus(Activity activity)把状态设置成false非激活状态,然后调用isAllActivityAlive()查看是不是所有的Activity处于非激活状态,如果都是非激活状态(所有的Activity都执行过OnStop()),那就执行你想要做的操作!!!

    写的好乱啊...

  3.实现

  1.自定义Application

 1 package com.houny.testhomekey.application;
 2
 3 import java.util.HashMap;
 4 import java.util.Iterator;
 5 import java.util.Map;
 6
 7 import android.app.Activity;
 8 import android.app.Application;
 9
10 public class ManageApplication extends Application {
11     private HashMap<String, Boolean> mapActivity = new HashMap<String, Boolean>();// 用于存储activity对应的激活状态
12     private static ManageApplication application = null;
13
14     @Override
15     public void onCreate() {
16         super.onCreate();
17         application = this;
18     }
19
20     /**
21      * 把Activity和状态放到List中管理
22      *
23      * @param activity
24      * @param isActivitied
25      */
26     public void addActivityStatus(Activity activity, boolean isAlive) {
27
28         if (mapActivity.containsKey(activity.getClass().getName())) {
29             mapActivity.remove(activity.getClass().getName());
30             mapActivity.put(activity.getClass().getName(), isAlive);
31         } else {
32             mapActivity.put(activity.getClass().getName(), isAlive);
33         }
34
35     }
36
37     /**
38      * 判断是否有Activity是活动状态
39      *
40      * @return
41      */
42     public boolean isAllActivityAlive() {
43         boolean res = false;
44         Iterator iter = mapActivity.entrySet().iterator();
45         while (iter.hasNext()) {
46             Map.Entry entry = (Map.Entry) iter.next();
47             Object key = entry.getKey();
48             boolean value = (Boolean) entry.getValue();
49             if (value) {
50                 return true;
51             }
52         }
53
54         return res;
55     }
56
57     public static ManageApplication getInstance() {
58         return application;
59     }
60 }

  2.在 Mainfest中把Application设成自定义的Application

<application
        android:name="com.houny.testhomekey.application.ManageApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

  3.在每一个Activity中都做如下操作

    3.1 在OnCreat()中getApplication

    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        application = (ManageApplication) this.getApplication();
        setContentView(R.layout.activity_main);

        Log.e("Status", "OnCreate");
        findViewsById();
        setViewsListener();
    }

    3.2 重写OnResume(),增加当前Activity的状态为true激活状态

    

@Override
    protected void onResume() {
        Log.e("Status", "onResume");
        application.addActivityStatus(MainActivity.this, true);
        super.onResume();
    }

    3.3 重写OnStop(),更改当前Activity的状态为false非激活状态并判断所有的Activity是否都处于非激活状态

    

@Override
    protected void onStop() {
        Log.e("Status", "onStop");
        application.addActivityStatus(MainActivity.this, false);
        boolean alived = application.isAllActivityAlive();

        Log.e("All Activity Status", alived + "");

        if(!alived){
            //TODO 想要进行的操作
        }
        super.onStop();
    }

OK!!!大功告成!o(∩_∩)o

时间: 2024-10-13 02:42:48

另辟思路解决 Android 4.0.4 不能监听Home键的问题的相关文章

Android 优雅的让Fragment监听返回键

Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能.假设FragmentActivity有三个Fragment,一般安卓用户期望点击返回键会一层层返回到FragmentActivity.当然,我们可以将每个Fragment对应的Transaction放到BackStack中,但是如果每个Fragment有对返回事件的特殊消费,那么在FragmentActivity的onBackPressed()中的代码就会比较混乱,例如: @Override public void

Android NDK开发(八)——应用监听自身卸载,弹出用户反馈调查

转载请注明出处:http://blog.csdn.net/allen315410/article/details/42521251 监听卸载情景和原理分析 1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各大应用中很常见的一个功能,同样也是基于JNI开发的Android应用小Demo,看完这个之后,不仅可以加深对NDK开发的理解,而且该Demo也可

Android 监听返回键退出程序的两种实现

1.Android 双击返回键退出程序 思路:用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定时器是每次用户按下返回键才去创建. 代码如下: /** * 菜单.返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyC

Android开发之使用广播监听网络状态变化

我们经常需要判断网络状态的变化,如有无网络,所以需要监听网络状态的变化,比如网络断开,网络连接给予友好提示.如何监听网络状态的变化呢,最近工作中需要用到这个,于是就用广播机制来实现了网络状态的监听. 使用广播机制来监听网络状态主要涉及到以下几点: 1.需要自己编写个网络广播接收器,该接收器继承BroadcastReceiver类,用来接收系统发出的广播.比如我自己写了个NetStatusReceiver广播接收器.代码如下: package com.log.system; import andr

大叔也说Xamarin~Android篇~监听返回键,单击返回某个webView,双击退出

原文:大叔也说Xamarin~Android篇~监听返回键,单击返回某个webView,双击退出 这个操作在原生android里是很容易实现的,在xamarin里也不难,在activity里有方法OnKeyDown,我们只需要重写一下就可以了,然后通过webView重新加载到要返回的页面即可,当然操作有些死板,但还是有着不错的效果! 实现的原理就是在activity里设置一个时间,单击后把这个时间赋值并与当前时间进行比较,如果在2秒内,就认为是双击操作,当然这个时间间隔你可以自己设置,在认为是双

android 监听返回键

android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { return true; } return super.onKeyDown(keyCode, event); } event.getRepeatCount() == 0重复次数:1次

Android监听返回键、Home键+再按一次返回键退出应用

Android监听返回键需重写onKeyDown()方法 Home键keyCode==KeyEvent.KEYCODE_HOME [java] view plain copy @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { //++自定义点击事件 return tru

Android开机和关机广播监听

Android开机.关机广播监听 一.开机广播的监听 1.在AndroidManifest.xml文件注册接收开机广播 <receiver android:name=".XXXBroadcastReceiver" > <intent-filter> <!-- 开机广播 --> <action android:name="android.intent.action.BOOT_COMPLETED" /> </inte

[转]Android 如何监听返回键,弹出一个退出对话框

本文转自:http://blog.csdn.net/sunnyfans/article/details/8094349 Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. 注:如下代码当时是从网上copy过来的,现在忘了它出自哪个原作者了,在此说声抱歉. 源码如下: [html] view plaincopyprint? public class BackKeyTest extends Activi