ActivityLifecycleCallbacks如何判斷APP是否在前臺
本文為大家分享了ActivityLifecycleCallbacks如何判斷APP是否在前臺,供大家參考,具體內(nèi)容如下
ActivityManager
通常情況下,我們判斷app是否在前臺都是通過 ActivityManager。
/**
* Activity是否在前臺
* @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;
}
但是這個并不是最好的:
- 性能差,相當(dāng)于遍歷所有的進程來找前臺的且包名符合的。
- 在有些手機上 不適用。
ActivityLifecycleCallbacks
Application可以通過 registerActivityLifecycleCallbacks 來注冊 ActivityLifecycleCallbacks 接口,以實現(xiàn)對所有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) {
}
});
每一個Activity的生命周期都會回調(diào)相應(yīng)的方法。意思是Application能監(jiān)聽所有Activity的生命周期咯,是不是很牛x。
這個功能可以用來做某種統(tǒng)計,或者弄成一個Activity鏈表可以知道前后Activity什么的,雖然目前還沒遇到這種需求,當(dāng)然了”判斷APP是否在前臺“這個功能算半個不過分吧。
生命周期
然后,為了達到 ”判斷APP是否在前臺“這個功能,我們需要先知道activity的生命周期。是不是很簡單?
但是很多人不知道 如果ActivityA intent跳轉(zhuǎn)到 ActivityB,這兩個的生命周期是怎么切換的。
公布答案:
ActivityA.OnPause() —> AcitivityB.OnCreate() —> AcitivityB.OnStart() —> ActivityB.OnResume() —> ActivityA.OnStop()
其實,也確實應(yīng)該是這樣嘛,你要切換新界面,總得等新界面顯示出來了,才能去處理舊界面??偛荒芟劝雅f的處理掉,然后黑屏加載新界面吧。
判斷APP是否在前臺
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) {
}
});
- 新建個int變量 count
- 然后在Application.onCreate()中注冊回調(diào)
- onActivityStarted()中 count+1,如果count為1,則進入前臺;onActivityStopped()中 count-1,如果count為0,則進入后臺。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 中CheckBox多項選擇當(dāng)前的position信息提交的示例代碼
這篇文章主要介紹了Android 中CheckBox多項選擇當(dāng)前的position信息提交的示例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-07-07
JetpackCompose Navigation導(dǎo)航實現(xiàn)流程
Navigation是Jetpack用于Android導(dǎo)航的組件,作用是處理頁面跳轉(zhuǎn),以及頁面跳轉(zhuǎn)過程中的交互。使用Navigation,你就需要為每個頁面設(shè)定一條唯一路徑,它是一個String常量,形式是DeepLink的樣子,從一個頁面跳轉(zhuǎn)到另一個頁面,它通過輸入目的地的路徑進行轉(zhuǎn)跳2023-01-01
Android截取視頻幀并轉(zhuǎn)化為Bitmap示例
利用MediaMetadataRetriever按照時間截取視頻并轉(zhuǎn)換為Bitmap存放于SDCard,具體實現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06
RxJava入門指南及其在Android開發(fā)中的使用示例
RxJava是JVM的一個擴展庫,它能夠幫助Java更加方便地實現(xiàn)基于事件的編程,這對安卓來說十分有用,接下來就一起來看一下RxJava入門指南及其在Android開發(fā)中的使用示例:2016-06-06
Android的ListView多選刪除操作實現(xiàn)代碼
這篇文章主要為大家詳細介紹了Android的ListView多選刪除操作實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05

