轉(zhuǎn)自?? 優(yōu)雅的使用ActivityLifecycleCallbacks管理Activity和區(qū)分App前后臺 - CSDN博客
一择懂、ActivityLifecycleCallbacks接口介紹
API
14之后癌椿,在Application類中,提供了一個應用生命周期回調(diào)的注冊方法,用來對應用的生命周期進行集中管理,這個接口叫registerActivityLifecycleCallbacks,可以通過它注冊自己的ActivityLifeCycleCallback缰猴,每一個Activity的生命周期都會回調(diào)到這里的對應方法。之前我們想做類似限制制定Activity個數(shù)的時候都要自己去添加和計數(shù)疤剑,有了ActivityLifeCycleCallback接口滑绒,所有Activity的生命周期都會在這里回調(diào),我們可以根據(jù)條件隨心處理隘膘。
Activity生命周期圖:
ActivityLifecycleCallbacks接口代碼:
兩者幾乎是一一對應的疑故,不管是做Activity的限制還是Activity的狀態(tài)統(tǒng)計都是非常方便的,里面還有一個void
onActivitySaveInstanceState(Activity activity, Bundle outState)
方法弯菊,非常方便我們來保存Activity狀態(tài)數(shù)據(jù)纵势,是不是很周到美滋滋!
二管钳、判斷App前后臺狀態(tài)
App 前后臺的切換一般情況下都是按Home來進行钦铁,當然也有別的方式,但是此時Activity的生命周期是一樣的:
HOME鍵前后臺切換Activity的執(zhí)行順序:onPause->onStop->onRestart->onStart->onResume
BACK鍵前后臺切換Activity鍵的順序: onPause->onStop->onDestroy->onCreate->onStart->onResume
其實按BACK按鍵就是退出app了才漆,不算是前臺后切換牛曹。
現(xiàn)在我們知道App的由前臺切換到后臺所有打開的Activity會走:
onPause->onStop
后臺切換到前臺所有打開的Activity會走:
->onRestart->onStart->onResume
前后臺切換App所有打開的Activity的生命周期都是一樣的,這樣我就可以在ActivityLifecycleCallbacks回調(diào)接口中記錄生命周期:
App類最終完整代碼:
/**
* Created by dawish on 2017/2/16.
*/publicclassAppextendsApplication{//記錄Activity的總個數(shù)publicintcount =0;privatestaticApp mApp;publicstaticStack store;//商品詳情頁最多個數(shù),這里為了測試只寫了2,大家根據(jù)自己的情況設值privatestaticfinalintMAX_ACTIVITY_DETAIL_NUM =2;@OverridepublicvoidonCreate() {super.onCreate();? ? ? ? mApp =this;? ? ? ? store =newStack<>();? ? ? ? registerActivityLifecycleCallbacks(newSwitchBackgroundCallbacks());? ? }publicstaticAppgetAppContext() {returnmApp;? ? }/**? ? *? ? * @paramid? ? * @return*/publicstaticbooleantoGoodsDetail(String id){if(store ==null|| store.empty()){returnfalse;? ? ? ? }for(ActivityDetail activityDetail : store){if(id.equalsIgnoreCase(activityDetail.getID())){//當前商品的詳情頁已經(jīng)打開activityDetail.finish();//? ? ? ? ? ? ? ? 這是你需要在AndroidManifest.xml中添加"Android.permission.STOP_APP_SWITCHES"用戶權限醇滥,前提是必須是系統(tǒng)應用才可以黎比。//? ? ? ? ? ? ? ? ActivityManager am = (ActivityManager) getAppContext().getSystemService(Activity.ACTIVITY_SERVICE);//? ? ? ? ? ? ? ? am.moveTaskToFront(activityDetail.getTaskId(), 0);returntrue;? ? ? ? ? ? }? ? ? ? }returnfalse;? ? }privateclassSwitchBackgroundCallbacksimplementsActivityLifecycleCallbacks{@OverridepublicvoidonActivityCreated(Activity activity, Bundle bundle) {if(activityinstanceofActivityDetail) {if(store.size() >= MAX_ACTIVITY_DETAIL_NUM){? ? ? ? ? ? ? ? ? ? store.peek().finish();//移除棧底的詳情頁并finish,保證商品詳情頁個數(shù)最大為10}? ? ? ? ? ? ? ? store.add((ActivityDetail) activity);? ? ? ? ? ? }? ? ? ? }@OverridepublicvoidonActivityStarted(Activity activity) {if(count ==0) {//后臺切換到前臺Log.v("danxx",">>>>>>>>>>>>>>>>>>>App切到前臺");? ? ? ? ? ? }? ? ? ? ? ? count++;? ? ? ? }@OverridepublicvoidonActivityResumed(Activity activity) {? ? ? ? }@OverridepublicvoidonActivityPaused(Activity activity) {? ? ? ? }@OverridepublicvoidonActivityStopped(Activity activity) {? ? ? ? ? ? count--;if(count ==0) {//前臺切換到后臺Log.v("danxx",">>>>>>>>>>>>>>>>>>>App切到后臺");? ? ? ? ? ? }? ? ? ? }@OverridepublicvoidonActivitySaveInstanceState(Activity activity, Bundle bundle) {? ? ? ? }@OverridepublicvoidonActivityDestroyed(Activity activity) {? ? ? ? ? ? store.remove(activity);? ? ? ? }? ? }/**? ? * 獲取當前的Activity? ? *? ? * @return*/publicActivitygetCurActivity() {returnstore.lastElement();? ? }}