Activity是Android四大组件之一,主要用于提供窗口与用户进行交互。
Activity的生命周期
基本生命周期
onCreate(null) -> onStart() - > onResume() -> onPause() -> onStop() -> onDestroy()
前后台切换的生命周期
- 切到后台时,保存数据
onCreate() -> onStart() - > onResume() -> onPause() -> onSaveInstanceState()-> onStop() - 回到前台时(App被杀死,需要恢复保存的数据)
onCreate(Bundle) -> onStart() -> onRestoreInstanceState(Bundle)-> onResume() - 回到前台时(App未被杀死,无需恢复保存的状态)
onRestart() - > onResume()
屏幕旋转(键盘隐藏显示,屏幕大小改变等)的生命周期
- 未配置android:configChanges时,Activity会重建
onCreate() -> onStart() -> onResume() -> - 发生旋转
onPause() -> onSaveInstanceState()-> onStop()->onDestroy()
-> onCreate(Bundle) -> onStart() -> onRestoreInstanceState(Bundle)- > onResume() - 配置了android:configChanges时,Activity不会被重建,会调用onConfigurationChanged()方法
应用暂停(被其他透明actvity覆盖)的生命周期 或者 开启了多窗口模式(API24+),焦点在其他窗口
- 启动到被透明Activity遮挡(可以看到UI,但是不能交换)
onCreate() -> onStart() - > onResume() -> onPause() - 从透明Activity返回
onResume
应用暂停(被其他半透明actvity覆盖)的生命周期 或者 开启了多窗口模式(API24+),焦点在其他窗口
- 启动到被透明Activity遮挡(可以看到UI,但是不能交换)
onCreate() -> onStart() -> onResume() -> onPause() - 从透明Activity返回
onResume
不常用生命周期
- onPostResume
在onResume执行完毕后回调。一般在这个毁掉中获取view的宽高,在此之前View还没有初始化好,可能无法取到宽高。 - onUserLeaveHint
当用户按下home键或menu键时会回调
其他场景的生命周期
- dialog不影响activity的生命周期
Activity的启动模式
standard 默认模式
- 每次都会创建一个新的实例,并将这个新的Activity加入当前task栈中
- 一个Activity会有多个实例存在
- 新的Activity和启动它的activity(standard,singleTop)在同一个任务栈
- taskAffinity不会开启新的任务栈
singleTop 栈顶复用模式
- 当要被启动的Activity位于当前task栈顶时,复用当前Activity(回调onNewIntent);否则不复用,同standard。
- 一个Activity在任务栈可能有多个实例存在
- 新的Activity和启动它的activity(standard,singleTop)在同一个任务栈
- taskAffinity不会开启新的任务栈
singleTask 栈内复用模式:
- 在同一个task栈中只有一个Activity实例。
- 新的Activity和启动它的activity(standard,singleTop)在同一个任务栈
- 如果栈中存在实例,则复用。且如果不在栈顶,移除栈顶一个或多个Activity
- taskAffinity会开启新的任务栈
singleInstance 全局唯一模式:
- 全局(适用多个APP)只有一个Activity实例。若Activity已存在则复用,否则在一个全新的task栈创建新的Activity。
- 新的Activity和启动它的activity不在同一个任务栈
- singleInstance启动standard的Activity和启动它的activity(standard,singleTop)在同一个栈
Intent Flag
在代码中为Intent设置指定Flag,会达到可某些启动模式相同的效果
FLAG_ACTIVITY_NEW_TASK: 与singleTask的行为相同
FLAG_ACTIVITY_SINGLE_TOP:与singleTop的行为相同
FLAG_ACTIVITY_CLEAR_TOP:一般与FLAG_ACTIVITY_NEW_TASK
一起使用,可以查找其他任务栈的的现有Activity。如果activity的启动模式为standard
,系统会将其从堆栈中移除,并在它的位置启动一个新实例处理传入的intent。
startActivity不会报错permission denied的情况(符合一条且不和其他项冲突即可)
- 同一Application下
- Uid相同
- permission匹配
- 目标Activity的属性Android:exported=”true”
- 目标Activity具有相应的IntentFilter,存在Action动作或其他过滤器并且没有设置exported=false
- 启动者的Pid是一个System Server的Pid
- 启动者的Uid是一个System Uid(Android规定android.system.uid=1000,具有该Uid的application,我们称之为获得Root权限)
控制Activity处于后台时的行为
当用户离开任务较长时,系统默认会清除任务中除根Activity以外的所有Activity,当用户返回时,只有根Activity会恢复。
可以通过修改Activity的属性修改此行为
alwaysRetainTaskState:值为true时,即使经过很长时间,任务仍然在堆栈中保留所有Activity
clearTaskOnLaunch:值为true时,只要用户离开任务再返回,就会返回到任务栈的初始状态,只剩根Activity,即使短暂离开也是。
finishOnTaskLaunch:与clearTaskOnLaunch
类似,只是这个属性只会作用域单个Activity,该属性可能导致任何Activity消失,包括根。当用户离开再返回,属性设为true时,当前Activity会消失。