ActivityLifecycleCallbacks如何判断APP是否在前台
本文为大家分享了ActivityLifecycleCallbacks如何判断APP是否在前台,供大家参考,具体内容如下
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; }
但是这个并不是最好的:
- 性能差,相当于遍历所有的进程来找前台的且包名符合的。
- 在有些手机上 不适用。
ActivityLifecycleCallbacks
Application可以通过 registerActivityLifecycleCallbacks 来注册 ActivityLifecycleCallbacks 接口,以实现对所有Activity生命周期的回调。
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的生命周期都会回调相应的方法。意思是Application能监听所有Activity的生命周期咯,是不是很牛x。
这个功能可以用来做某种统计,或者弄成一个Activity链表可以知道前后Activity什么的,虽然目前还没遇到这种需求,当然了”判断APP是否在前台“这个功能算半个不过分吧。
生命周期
然后,为了达到 ”判断APP是否在前台“这个功能,我们需要先知道activity的生命周期。是不是很简单?
但是很多人不知道 如果ActivityA intent跳转到 ActivityB,这两个的生命周期是怎么切换的。
公布答案:
ActivityA.OnPause() —> AcitivityB.OnCreate() —> AcitivityB.OnStart() —> ActivityB.OnResume() —> ActivityA.OnStop()
其实,也确实应该是这样嘛,你要切换新界面,总得等新界面显示出来了,才能去处理旧界面。总不能先把旧的处理掉,然后黑屏加载新界面吧。
判断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()中注册回调
- onActivityStarted()中 count+1,如果count为1,则进入前台;onActivityStopped()中 count-1,如果count为0,则进入后台。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
Android手机号码输入框(满11位自动跳到下个输入框)实例代码
这篇文章主要介绍了Android手机号码输入框(满11位自动跳到下个输入框)实例代码,需要的朋友可以参考下2017-10-10Android 开发之Dialog,Toast,Snackbar提醒
这篇文章主要介绍了Android 开发之Dialog,Toast,Snackbar提醒的相关资料,需要的朋友可以参考下2017-03-03Android编程之Application设置全局变量及传值用法实例分析
这篇文章主要介绍了Android编程之Application设置全局变量及传值用法,结合实例形式较为详细的分析了全局变量及传值的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下2015-12-12Android高版本API方法如何在低版本系统上做兼容性处理浅析
这篇文章主要给大家介绍了关于Android高版本API方法如何在低版本系统上做兼容性处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧2018-08-08
最新评论