ActivityLifecycleCallbacks如何判斷APP是否在前臺(tái)
本文為大家分享了ActivityLifecycleCallbacks如何判斷APP是否在前臺(tái),供大家參考,具體內(nèi)容如下
ActivityManager
通常情況下,我們判斷app是否在前臺(tái)都是通過(guò) ActivityManager。
/** * Activity是否在前臺(tái) * @param context * @return */ private boolean isOnForground(Context context){ ActivityManager activityManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> appProcessInfoList = activityManager.getRunningAppProcesses(); if(appProcessInfoList == null){ return false; } String packageName = context.getPackageName(); for(ActivityManager.RunningAppProcessInfo processInfo : appProcessInfoList){ if(processInfo.processName.equals(packageName) && processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND ){ return true; } } return false; }
但是這個(gè)并不是最好的:
- 性能差,相當(dāng)于遍歷所有的進(jìn)程來(lái)找前臺(tái)的且包名符合的。
- 在有些手機(jī)上 不適用。
ActivityLifecycleCallbacks
Application可以通過(guò) registerActivityLifecycleCallbacks 來(lái)注冊(cè) ActivityLifecycleCallbacks 接口,以實(shí)現(xiàn)對(duì)所有Activity生命周期的回調(diào)。
this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } });
每一個(gè)Activity的生命周期都會(huì)回調(diào)相應(yīng)的方法。意思是Application能監(jiān)聽(tīng)所有Activity的生命周期咯,是不是很牛x。
這個(gè)功能可以用來(lái)做某種統(tǒng)計(jì),或者弄成一個(gè)Activity鏈表可以知道前后Activity什么的,雖然目前還沒(méi)遇到這種需求,當(dāng)然了”判斷APP是否在前臺(tái)“這個(gè)功能算半個(gè)不過(guò)分吧。
生命周期
然后,為了達(dá)到 ”判斷APP是否在前臺(tái)“這個(gè)功能,我們需要先知道activity的生命周期。是不是很簡(jiǎn)單?
但是很多人不知道 如果ActivityA intent跳轉(zhuǎn)到 ActivityB,這兩個(gè)的生命周期是怎么切換的。
公布答案:
ActivityA.OnPause() —> AcitivityB.OnCreate() —> AcitivityB.OnStart() —> ActivityB.OnResume() —> ActivityA.OnStop()
其實(shí),也確實(shí)應(yīng)該是這樣嘛,你要切換新界面,總得等新界面顯示出來(lái)了,才能去處理舊界面。總不能先把舊的處理掉,然后黑屏加載新界面吧。
判斷APP是否在前臺(tái)
this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { count++; if(count == 1){ Log.e("ZXK","foreground"); } } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { count--; if(count == 0){ Log.e("ZXK","background"); } } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } });
- 新建個(gè)int變量 count
- 然后在Application.onCreate()中注冊(cè)回調(diào)
- onActivityStarted()中 count+1,如果count為1,則進(jìn)入前臺(tái);onActivityStopped()中 count-1,如果count為0,則進(jìn)入后臺(tái)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)用小技巧之利用Lifecycle寫(xiě)出更好維護(hù)的代碼
lifecycle是一個(gè)類,用于存儲(chǔ)有關(guān)組件(如Activity或Fragment)的生命周期狀態(tài)的信息,并允許其他對(duì)象觀察此狀態(tài),下面這篇文章主要給大家介紹了關(guān)于Android實(shí)用小技巧之利用Lifecycle寫(xiě)出更好維護(hù)的代碼的相關(guān)資料,需要的朋友可以參考下2022-05-05Android計(jì)時(shí)器控件Chronometer應(yīng)用實(shí)例
這篇文章主要為大家詳細(xì)介紹了Android計(jì)時(shí)器控件Chronometer應(yīng)用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09使用Composing?builds提升Android編譯速度
這篇文章主要介紹了使用Composing?builds提升Android編譯速度示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Android開(kāi)發(fā)實(shí)現(xiàn)讀取Assets下文件及文件寫(xiě)入存儲(chǔ)卡的方法
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)讀取Assets下文件及文件寫(xiě)入存儲(chǔ)卡的方法,涉及Android文件與目錄的讀取、寫(xiě)入、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Android編程實(shí)現(xiàn)WebView添加進(jìn)度條的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)WebView添加進(jìn)度條的方法,涉及Android WebView界面及控件功能相關(guān)操作技巧,需要的朋友可以參考下2017-02-02Android Bluetooth藍(lán)牙技術(shù)使用流程詳解
這篇文章主要介紹了Android Bluetooth藍(lán)牙技術(shù)使用流程詳解的相關(guān)資料,需要的朋友可以參考下2016-02-02Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫(huà)效果(五)
這篇文章主要為大家詳細(xì)介紹了Flutter進(jìn)階之實(shí)現(xiàn)動(dòng)畫(huà)效果的第五篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08