神奇的ActivityLifecycleCallbacks
2018-01-20 18:28
369 查看
Android自 API 14开始引入了一个方法,即Application的
我们先来看下面的一个简单代码块:
可能有人会有个疑问,
这里使用饿汉式单例模式来弱引用保存了
正如上面说,
想必大家都了解两个
因为我们可以通过
registerActivityLifecycleCallbacks方法,用来监听所有Activity的生命周期回调。通过这个方法,我们可以轻松获取到当前运行的
Activity的实例,还可以判断应用是在前台运行还是后台运行。
我们先来看下面的一个简单代码块:
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { ActivityManager.getInstance().setCurrentActivity(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) { } }); } }
可能有人会有个疑问,
ActivityManager是个什么鬼东西来的,ok,我们现在看一下这个类的实现:
public class ActivityManager { private static ActivityManager mInstance = new ActivityManager(); private WeakReference<Activity> mCurrentActivityWeakRef; private ActivityManager() { } public static ActivityManager getInstance() { return mInstance; } public Activity getCurrentActivity() { if (mCurrentActivityWeakRef != null) { return mCurrentActivityWeakRef.get(); } return null; } public void setCurrentActivity(Activity activity) { mCurrentActivityWeakRef = new WeakReference<>(activity); } }
这里使用饿汉式单例模式来弱引用保存了
Activity的实例。这个实例保存下来可以说有非常多的用处,特别是在处理
Serivice里面来触发对应
Activity的跳转之类的需求。这里感谢一下技术小黑屋 ,提供了这个个非常有用的方法。
正如上面说,
registerActivityLifecycleCallbacks方法还可以帮助我们判断应用是处于前台运行还是后台运行。这个判断方法也很简单,直接看下面的代码:
public class MyApplication extends Application { private int activityCounter = 0; @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { activityCounter++; } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { activityCounter--; } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } }); } public boolean getAppFrontRunning() { return activityCounter>0; } }
想必大家都了解两个
Activity之间的跳转的生命周期:
A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()
因为我们可以通过
Activity的生命周期的追踪回调,对
activityCounter进行简单的加减处理,从而只需要判断
activityCounter是否大于0即可知道当前应用是否处于前台运行。
结语
综上所述,registerActivityLifecycleCallbacks一个很好用的方法,但是如果你的应用需要兼容到 API 14版本以下,就不能采取这种方式。
相关文章推荐
- Activity生命周期监听接口:ActivityLifecycleCallbacks
- ActivityLifecycleCallbacks 的简单使用
- ActivityLifecycleCallbacks
- registerActivityLifecycleCallbacks 的用途(kotlin)
- ActivityLifecycleCallbacks 判断APP是否在前台
- ActivityLifecycleCallbacks
- Kotlin项目Application registerActivityLifecycleCallbacks 方法踩坑
- 神奇的ActivityLifecycleCallbacks,解决Activity管理的后顾之忧
- Android -- ActivityLifeCycleCallbacks
- 用ActivityLifecycleCallbacks 判断前后台运行
- ActivityLifecycleCallbacks 对Activity的生命周期事件进行集中处理
- 关于Activity、Fragment、ActivityLifecycleCallbacks、FragmentLifecycleCallbacks的生命周期方法执行顺序
- registerActivityLifecycleCallbacks 的用途
- Android activitylifecyclecallbacks
- ActivityLifecycleCallbacks
- Android 集中处理Activity的生命周期事件: Application.ActivityLifecycleCallbacks
- 适应6.0,全局Dialog终极解决方案 Application.ActivityLifecycleCallbacks
- ActivityLifecycleCallbacks 实现app中所有Activity实例查找
- Application中的管理所有activity的利器:ActivityLifecycleCallbacks
- 详解ActivityLifecycleCallbacks