Activity 的生命周期
生命周期:onCreate() -> onStart() - > onResume() -> onPause() -> onStop() -> onDestroy()

-
启动 Activity:系统先调用 onCreate(),然后调用 onStart(),最后调用 onResume()方法,Activity 进入运行状态。
-
Activity 被其他 Activity 覆盖其上(DialogActivity)或者锁屏:系统会调用 onPause() 方法,暂停当前 Activity 的执行。
-
当前 Activity 由被覆盖状态回到前台或者解锁屏:系统会调用 onResume() 方法,再次进入运行状态。
-
当前 Activity 转到新的 Activity 界面或按 Home 键回到主屏,自身退居后台:系统会先调用onPause() 方法,然后调用 onStop() 方法,进入停滞状态。
-
用户后退回到此 Activity:系统会先调用 onRestart() 方法,然后调用 onStart() 方法,最后调用 onResume() 方法,再次进入运行状态。
-
当前 Activity 处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前 Activity,而后用户退回当前 Activity:再次调用 onCreate() 方法、onStart() 方法、onResume() 方法,进入运行状态。
-
用户退出当前 Activity:系统先调用 onPause() 方法,然后调用 onStop() 方法,最后调用onDestory() 方法,结束当前 Activity。
-
onRestart():表示 Activity 正在重新启动 ,一般情况下,当前 Activity 从不可见重新变成可见状态时,onRestart() 就会被调用,这种情形一般是用户行为所导致的,比如用户按 Home 键切换到桌面然后重新打开 APP 或者按 Back 键。
-
onStart():Activity 可见了,但是还没有出现在前台,还无法和用户交互。
-
onPause():表示 Activity 正在停止,此时可以做一些存储数据,停止动画等工作,注意不能太耗时,因为这会影响到新 Activity 的显示,onPause() 必须先执行完,新的 Activity 的onResume() 才会执行。
-
从 Activity 是否可见来说,onStart() 和onStop()是配对的,从activity是否在前台来说,onResume()和onPause()是配对的。
-
旧 Activity 先 onPause(),然后新 Activity 再启动。
注意:当 Activity 中弹出 Dialog 对话框的时候,Activity 不会回调onPause()。
然而当 Activity 启动 Dialog 风格的 Activity 的时候,此 Activity 会回调 onPause() 函数。
异常情况下的生命周期
情况1:资源相关的系统配置发生改变导致 Activity 被杀死并重新创建
比如说当前 Activity 处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity 就会被销毁并且重新创建,当然我们也可以组织系统重新创建我们的 Activity。

系统配置发生改变以后,Activity 会销毁,其 onPause(),onStop(),onDestory()均会被调用,由于 Activity 是在异常情况下终止的,系统会调用 onSaveInstance() 来保存当前 Activity 状态,这个方法的调用时机是在 onStop() 之前。与 onPause() 没有既定的时序关系,当 Activity 重新创建后,系统会调用 onRestoreInstanceState(),并且把 Activity 销毁时 onSaveInstanceState()方法保存的 Bundle 对象作为参数同时传递给 onRestoreInstanceState() 和 onCreate() 方法。
同时,在 onSaveInstanceState() 和 onRestoreInstanceState() 方法中,系统自动为我们做了一些恢复工作,如:文本框(EditeText)中用户输入的数据,ListView 滚动的位置等,这些 View相关的状态系统都能够默认为我们恢复。可以查看 View 源码,和 Activity 一样,每个 View 都有 onSaveInstanceState()方法和onRestoreInstanceState()方法。
情况2:资源内存不足导致低优先级的 Activity 被杀死
这里的情况和前面的情况1数据存储和恢复是完全一致的,Activity 按照优先级从高到低可以分为如下三种:
(1)前台 Activity --- 正在和用户交互的Activity,优先级最高
(2)可见但非前台 Activity --- 比如 Activity 中弹出了一个对话框,导致 Activity 可见但是位于后台无法和用户直接交互。
(3)后台 Activity --- 已经被暂停的 Activity,比如执行了 onStop(),优先级最低。
横竖屏切换,防止重新创建 Activity:Activity 指定 configChange 属性来不让系统重新创建Activity。
android : configChanges = "orientation"
Activity与Fragment生命周期关系
创建过程:

销毁过程:

Activity的启动模式
有四种启动模式:standard,singleTop,singleTask,singleInstance。
- standard 模式:在这种模式下,Activity 默认会进入启动它的 Activity 所属的任务栈中。 注意:在非 Activity类型的 Context(如ApplicationContext)并没有所谓的任务栈,所以不能通过ApplicationContext 去启动 standard 模式的 Activity。
- singleTop 模式:栈顶复用模式。如果新 Activity 位于任务栈的栈顶的时候,Activity 不会被重新创建,同时它的 onNewIntent()方法会被回调。注意:这个 Activity 的 onCreate(),onStart(),onResume()不会被回调,因为他们并没有发生改变。
- singleTask 模式:栈内复用模式。只要 Activity 在一个栈中存在,那么多次启动此 Activity 不会被重新创建单例,系统会回调 onNewIntent()。比如 ActivityA,系统首先会寻找是否存在A想要的任务栈,如果没有则创建一个新的任务栈,然后把 ActivityA 压入栈,如果存在任务栈,然后再看看有没有 ActivityA 的实例,如果实例存在,那么就会把A调到栈顶并调用它的 onNewIntent()方法,如果不存在则把它压入栈。
- singleInstance 模式:单实例模式。这种模式的 Activity 只能单独地位于一个任务栈中。由于站内复用特性,后续的请求均不会创建新的 Activity 实例。
网友评论