🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 生命周期 ![](https://img.kancloud.cn/a4/80/a480d36f922574af329b4c19017ab569_672x516.png) 当我们从activity A到Activity B时,执行的生命周期的执行顺序如下:  A.onPause -> B.onCreate -> B.onStart -> B.onResume -> A.onStop 当我们从activity B返回Activity A时,执行的生命周期的执行顺序如下:  B.onPause -> A.onRestart ->A.onStart -> A.onResume -> B.onStop -> B.onDestory 程序按back 退出: onPause()->onStop()->onDestory(),再进入:onCreate()->onStart()->onResume(); 程序按home 退出: onPause()->onStop(),再进入:onRestart()->onStart()->onResume(); ## onSaveInstanceState or onRestoreInstanceState onSaveInstanceState在 onstop之前 不保证与onPause的顺序 onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则 onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。 1. 配置发生变化(键盘 旋转 ..) 2. 内存不足被回收 ## 前后切换监听 当我们从activity A到Activity B时,执行的生命周期的执行顺序如下:  A.onPause -> B.onCreate -> B.onStart -> B.onResume -> A.onStop 因此我们在Activity的onStart和onStop方法中用变量count计数,在onStart中先判断是否等于0再将变量加1,onStop中先减1再判断是否等于0 ~~~ 假设应用有两个Activity,分别为A和B。 情况1,首先启动A,A再启动B,然后关掉B: A启动后(onStart后),count=1; A启动B,先B.onStart 然后A.onStop,count先加1后减1,count为1。 关掉B,先A.onStart 然后B.onStop,count先加1后减1,count为1 情况2,首先启动A,然后按Home键返回桌面: A启动后(onStart后),count=1; 按Home键返回桌面,会执行A.onStop,count的计数变位0。 ~~~ 关键代码 ~~~ public class BaseTaskSwitch implements Application.ActivityLifecycleCallbacks { public int mCount = 0; private OnTaskSwitchListener mOnTaskSwitchListener; private static BaseTaskSwitch mBaseLifecycle; public static BaseTaskSwitch init(Application application) { if (null == mBaseLifecycle) { mBaseLifecycle = new BaseTaskSwitch(); application.registerActivityLifecycleCallbacks(mBaseLifecycle); } return mBaseLifecycle; } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} @Override public void onActivityStarted(Activity activity) { if (mCount++ == 0) { mOnTaskSwitchListener.onTaskSwitchToForeground(); } } @Override public void onActivityResumed(Activity activity) {} @Override public void onActivityPaused(Activity activity) {} @Override public void onActivityStopped(Activity activity) { if (--mCount == 0) { mOnTaskSwitchListener.onTaskSwitchToBackground(); } } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {} @Override public void onActivityDestroyed(Activity activity) {} public void setOnTaskSwitchListener(OnTaskSwitchListener listener) { mOnTaskSwitchListener = listener; } public interface OnTaskSwitchListener { void onTaskSwitchToForeground(); void onTaskSwitchToBackgroun ~~~ ## 启动模式 ### 1\. Standard 标准模式 **说明:** Android创建Activity时的默认模式,假设没有为Activity设置启动模式的话,默觉得标准模式。每次启动一个Activity都会又一次创建一个新的实例入栈,无论这个实例是否存在。 **生命周期:** 如上所看到的,每次被创建的实例Activity 的生命周期符合典型情况,它的onCreate、onStart、onResume都会被调用。 **举例:** 此时Activity 栈中以此有A、B、C三个Activity,此时C处于栈顶,启动模式为**Standard 模式**。 若在C Activity中加入点击事件,须要跳转到还有一个同类型的C Activity。结果是还有一个C Activity进入栈中,成为栈顶。  ### 2\. SingleTop 栈顶复用模式 **说明:** 分两种处理情况:须要创建的Activity已经处于栈顶时,此时会直接复用栈顶的Activity。不会再创建新的Activity;若须要创建的Activity不处于栈顶,此时会又一次创建一个新的Activity入栈,同Standard模式一样。 **生命周期:** 若情况一中栈顶的Activity被直接复用时,它的onCreate、onStart不会被系统调用,由于它并没有发生改变。可是一个新的方法 **onNewIntent**会被回调(Activity被正常创建时不会回调此方法)。 #### 3\. SingleTask 栈内复用模式 **说明:** 若须要创建的Activity已经处于栈中时,此时不会创建新的Activity,而是将存在栈中的Activity上面的其他Activity所有销毁,使它成为栈顶。 **生命周期:** 同SingleTop 模式中的情况一同样。仅仅会又一次回调Activity中的 **onNewIntent**方法 **举例:** 此时Activity 栈中以此有A、B、C三个Activity。此时C处于栈顶,启动模式为**SingleTask 模式**。 情况一:在C Activity中加入点击事件,须要跳转到还有一个同类型的C Activity。结果是直接用栈顶的C Activity。情况二:在C Activity中加入点击事件,须要跳转到还有一个A Activity。 结果是将A Activity上面的B、C所有销毁,使A Activity成为栈顶。 ### 4\. SingleInstance 单实例模式 **说明:** SingleInstance比较特殊,是全局单例模式,是一种加强的SingleTask模式。它除了具有它所有特性外,还加强了一点:具有此模式的Activity仅仅能单独位于一个任务栈中。 这个经常使用于系统中的应用,比如Launch、锁屏键的应用等等,整个系统中仅仅有一个!所以在我们的应用中一般不会用到。了解就可以。 **举例:** 比方 A Activity是该模式,启动A后。系统会为它创建一个单独的任务栈,由于栈内复用的特性。兴许的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁。 ## 参考资料 [Android前后台切换监听的再进化](https://blog.csdn.net/fei20121106/article/details/79568838)