一、Activity 生命周期
这里用Activity1
、Activity2
来举例说明生命周期的流程
- 启动
Activity1
:系统调用onCreate()
,然后调用onStart()
,在调用onResume()
,activity
进入运行状态。 Activity1
被其它Activity覆盖
其上 (DialogActivity) 或者锁屏
:系统会调用onPause()
,暂停当前Activity
的运行。Activity1
由被覆盖状态回到前台
或者解锁屏
:系统会调用onResume()
,再次进入运行状态。Activity1
跳转到Activity2
界面或者按HOME
键回到主屏,自身退居后台:系统会先调用onPause()
,然后调用onStop()
,进入停滞状态。- 当返回到
Activity1
时:系统会先调用onRestart()
,然后调用onStart()
,在调用onResume()
,再次进入运行状态。 - 当
Activity1
是被覆盖状态或后太不可见状态时(第2步或第4步),系统内存不足,会杀死Activity1
,当退回Activity1
时:会再次调用onCreate()
、onStart()
、onResume()
。 - 退出
Activity1
时:系统先调用onPause()
,然后调用onStop()
,最后调用onDestory()
,结束Activity1
。 onRestart()
:表示Activity1
正在重启,一般情况下,Activity
从不可见
重新变成可见
状态时,o nRestart()
就会被调用,比如按HOME
键切换到桌面然后重新打开APP
或按back
键。onStart()
:Activity1
可见了,但是还没有出现在前台,无法和用户交互。onPause()
:表示Activity1
正在停止,此时可以做一些存储数据,停止动画等工作,但是不能太耗时,因为会影响到Activity2
的显示,onPause()
必须执行完,Activity2
的onResume()
才会执行(旧Activity
先onPause()
,然后新Activity
在启动)。
- 从
Activity
是否可见来说,onStart()
和onStop()
是配对的; - 从
Activity
是否在前台来说,onResume()
和onPause()
是配对的; - 当
Activity
中弹出dialog
对话框,Activity 不会 调用onPause()
; - 当
Activity
中弹出dialog风格的Activity
时,Activity 就会 调用onPause()
;
二、异常情况下的生命周期
情况一:资源相关的系统配置发生改变导致Activity
被杀死并重新创建
比如屏幕旋转,默认情况下,Activity
会被销毁并重新创建
-
系统配置发生改变以后,
Activity
会销毁,其onPause()
、onStop()
、onDestory()
都会被调用,由于Activity
是在异常情况下终止的,系统会调用onSaveInstance()
来保存当前Activity
的状态,在onStop()
前调用。 -
当
Activity
重新创建后,系统会调用onRestoreInstanceState()
,并把Activity
销毁时onSavaInstanceState()
保存的Bundle
对象作为参数同时传给onCreate()
和onRestoreInstanceState()
(onRestoreInstanceState()
在onStart()
后调用)。 -
同时在
onSavaInstanceState()
和onRestoreInstanceState()
中,系统会自动做一些恢复工作,如EditText
中输入的数据,ListView
滚动的位置等View
相关的状态系统都能够默认恢复的。 -
生命周期如下:
onCreate() -> onStart() -> onResume() -> onPause() ->
onSaveInstanceState()
-> onStop() -> onDestry()
-> onCreate() -> onStart() ->onRestoreInstanceState()
-> onResume() -> onPause() -> onStop() -> onDestry()
情况二:资源内存不足导致低优先级的Activity
被杀死
这里的数据存储和恢复情况一是完全一样的
Activity
按照优先级从高到低分如下三种:
Activity | 优先级 | 出现条件 |
---|---|---|
前台Activity | 最高 | 正在和用户交互的Activity |
可见非前台Activity | 居中 | 比如Activity 中弹出一个对话框,导致Activity 可见但是位于后台无法了用户直接交互 |
后台Activity | 最低 | 已经暂停的Activity ,比如执行了onStop() |
三、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() 。比如 Activity1 ,系统首先会寻找是否存在Activity1 想要的任务栈,如果没有则创建一个新的任务栈,然后把Activity1 压入栈;如果存在任务栈,然后查看有没有Activity1 实例,如果实例存在,就会把Activity1 调到栈顶并调用它的onNewIntent() ,如果不存在则把它压入栈。 |
singleInstance 模式 | 单实例模式。这种模式的Activity 只能单独位于一个任务栈中。由于栈内复用特性,后续的请求不会创建新的 Activity 实例。 |
onNewIntent()
的使用:当Activity1
为singleTask
模式,如果Activity2
启动Activity1
(Activity1已存在)想给Activity1
传递数据,这个时候就用到了onNewIntent()
。
默认情况下,所有的
Activity
所需的任务栈的名字是应用的包名,可以通过Activity
指定的TaskAffinity
属性来指定任务栈,这个属性的值不能和包名相同,否则没有意义。