另辟思路解决 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的生命周期中,

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

 

    每一个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

你可能感兴趣的:(android 4.0)