問題描述: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