另闢思路解決 Android 4.0.4 不能監聽Home鍵的問題

問題描述:java

  自從Android 4.0之後,開發人員是不能監聽和屏蔽Home鍵的,對於KEYCODE_HOME,官方給出的描述以下:android

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

因此,除非修改Framework,都不能直接監聽Home鍵了,網上有朋友說監聽Log日誌,可是如今按Home鍵是不顯示Log日誌的,並且不一樣的手機型號即便顯示也不會同樣。ide

  在網上找了好多方法都沒有解決……無奈啊。this

  爲了實現用戶按了Home鍵以後處理事件,被逼的另闢蹊徑 使用下面的解決方案了。spa

解決方案:日誌

  1.思路code

    Activity的生命週期中,blog

    

 

    每個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

相關文章
相關標籤/搜索