ActivityLifecycleCallbacks如何判断APP是否在前台
本文为大家分享了ActivityLifecycleCallbacks如何判断APP是否在前台,供大家参考,具体内容如下
ActivityManager
通常情况下,我们判断app是否在前台都是通过ActivityManager。
/**
*Activity是否在前台
*@paramcontext
*@return
*/
privatebooleanisOnForground(Contextcontext){
ActivityManageractivityManager=(ActivityManager)context.getSystemService(ACTIVITY_SERVICE);
ListappProcessInfoList=activityManager.getRunningAppProcesses();
if(appProcessInfoList==null){
returnfalse;
}
StringpackageName=context.getPackageName();
for(ActivityManager.RunningAppProcessInfoprocessInfo:appProcessInfoList){
if(processInfo.processName.equals(packageName)&&processInfo.importance==ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
returntrue;
}
}
returnfalse;
} 
但是这个并不是最好的:
- 性能差,相当于遍历所有的进程来找前台的且包名符合的。
 - 在有些手机上不适用。
 
ActivityLifecycleCallbacks
Application可以通过registerActivityLifecycleCallbacks来注册ActivityLifecycleCallbacks接口,以实现对所有Activity生命周期的回调。
this.registerActivityLifecycleCallbacks(newActivityLifecycleCallbacks(){
@Override
publicvoidonActivityCreated(Activityactivity,BundlesavedInstanceState){
}
@Override
publicvoidonActivityStarted(Activityactivity){
}
@Override
publicvoidonActivityResumed(Activityactivity){
}
@Override
publicvoidonActivityPaused(Activityactivity){
}
@Override
publicvoidonActivityStopped(Activityactivity){
}
@Override
publicvoidonActivitySaveInstanceState(Activityactivity,BundleoutState){
}
@Override
publicvoidonActivityDestroyed(Activityactivity){
}
});
每一个Activity的生命周期都会回调相应的方法。意思是Application能监听所有Activity的生命周期咯,是不是很牛x。
这个功能可以用来做某种统计,或者弄成一个Activity链表可以知道前后Activity什么的,虽然目前还没遇到这种需求,当然了”判断APP是否在前台“这个功能算半个不过分吧。
生命周期
然后,为了达到”判断APP是否在前台“这个功能,我们需要先知道activity的生命周期。是不是很简单?
但是很多人不知道如果ActivityAintent跳转到ActivityB,这两个的生命周期是怎么切换的。
公布答案:
ActivityA.OnPause()—>AcitivityB.OnCreate()—>AcitivityB.OnStart()—>ActivityB.OnResume()—>ActivityA.OnStop()
其实,也确实应该是这样嘛,你要切换新界面,总得等新界面显示出来了,才能去处理旧界面。总不能先把旧的处理掉,然后黑屏加载新界面吧。
判断APP是否在前台
this.registerActivityLifecycleCallbacks(newActivityLifecycleCallbacks(){
@Override
publicvoidonActivityCreated(Activityactivity,BundlesavedInstanceState){
}
@Override
publicvoidonActivityStarted(Activityactivity){
count++;
if(count==1){
Log.e("ZXK","foreground");
}
}
@Override
publicvoidonActivityResumed(Activityactivity){
}
@Override
publicvoidonActivityPaused(Activityactivity){
}
@Override
publicvoidonActivityStopped(Activityactivity){
count--;
if(count==0){
Log.e("ZXK","background");
}
}
@Override
publicvoidonActivitySaveInstanceState(Activityactivity,BundleoutState){
}
@Override
publicvoidonActivityDestroyed(Activityactivity){
}
});
- 新建个int变量count
 - 然后在Application.onCreate()中注册回调
 - onActivityStarted()中count+1,如果count为1,则进入前台;onActivityStopped()中count-1,如果count为0,则进入后台。
 
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。