1. Activity
1.1. 起源
Activity是与用户交互的第一接口,系统采用Activity栈的方式来管理Activity。
1.2. Activity形态
- Active/Running: Activity处于Activity栈的最顶层,可见,并与用户进行交互
- Paused: Activity失去焦点,被一个新的非全屏的Activity或者一个透明的Activity放置在栈顶。只是失去了与用户交互的能力,所有状态信息、成员变量都还保持着,只有在系统内存极低的情况下,才会被系统回收掉
- Stopped: Activity被另一个Activity完全覆盖,不再可见,但依然保持了所有状态信息和成员变量
- Killed: Activity被系统回收掉或者Activity从来没有创建过
用户的不同动作,会让Activity在这四种状态间切换。而开发者,虽然可以控制Activity如何“生”,却无法控制Activity何时“死”
1.3. 生命周期
- Resumed: Activity处于栈顶,处理用户的交互
- Paused: Activity的一部分被挡住,不会接收用户输入
- Stopped: Activity完全被覆盖,不可见,仅在后台运行
1. Activity启动与销毁过程
启动:onCreate()
→onStart()
→onResume()
→进入Resumed状态
销毁:onDestroy()
→回到Killed形态
onCreate()
: 创建基本的UI元素
onPaused()
与onStop()
: 清除Activity的资源,避免浪费
onDestroy()
: 引用会在Activity销毁的时候销毁,而线程不会,所以清除开启的线程
2. Activity的暂停与恢复过程
栈顶的Activity部分不可见,调用onPause()
方法→进入Paused形态
结束阻塞后,调用onResume()
方法→恢复到Resume形态
onPause()
: 释放系统资源,如Camera、sensor、receivers
onResume()
: 需要重新初始化在onPause()
中释放的资源
3. Activity的停止过程
栈顶的Activity从部分不可见到可见,也就是恢复过程,调用onStart()
方法;从部分不可见到完全不可见,也就是停止过程。
4. Activity的重新创建过程
系统需要更多内存或者系统内存极为紧张时,系统就会回收Activity,而系统会将Activity状态通过onSaveInstanceState()
方法保存到Bundle对象中,也可以增加额外的键值对存入Bundle对象以保存这些状态。当需要重新创建这些Activity时,保存的Bundle对象会传递到Activity的onRestoreInstanceState()
方法与onCreate()
方法中,这也就是onCreate()
方法中参数Bundle savedInstanceState
的来源
onSaveInstanceState()
方法并不是每次当Activity离开前台时都会调用的,如果使用finish()
方法结束了Activity则不会调用。而且Android系统已经默认实现了控件的状态缓存,以此来减少开发者需要实现的缓存逻辑。
2. Android任务栈简介
当一个App启动时,如果当前环境中不存在该App的任务栈,那么系统就会创建一个任务栈,这个栈也被称为一个Task,即表示若干个Activity的集合。一个Task中的Activity可以来自不同的App,同一个App的Activity也可能不在一个Task中。
栈结构是后进先出的线性表。然而可以给Activity设置“特权”,就是通过在AndroidManifest文件中的属性android:launchMode
来设置或者是通过Intent的flag来设置的。
3. AndroidMainifest启动模式
3.1. standard
默认的启动模式。这种启动模式每次都会创建新的实例,即创建新的MainActivity覆盖在原Activity上。
3.2. singleTop
如果指定启动Activity为singleTop模式,那么在启动时,系统会判断当前栈顶Activity是不是要启动的Activity,如果是则不创建新的Activity而直接引用这个Activity,如果不是则创建新的Activity。这种启动模式虽然不会创建新的实例,但是系统仍会在Activity启动时调用onNewIntent()
方法。
3.3. singleTask
singleTask模式检测整个Activity栈中是否存在当前需要启动的Activity,如果存在,则将该Activity以上的Activity都销毁,将其置于栈顶。不过这里是指在同一个App中启动这个singleTask的Activity,如果是其他程序以singleTask模式来启动这个Activity,那么它将创建一个新的任务栈。如果启动的模式为singleTask的Activity已经在后台一个任务栈中了,那么启动后,后台的这个任务栈将一起被切换到前台
3.4. singleInstance
申明为singleInstance的Activity会出现在一个新的任务栈中,而且该任务栈中只存在这一个Activity
4. Intent Flag启动模式
常用的flag:
Intent.FLAG_ACTIVITY_NEW_TASK
: 使用一个新的Task来启动一个Activity,但启动的每个Activity都将在一个新的Task中。该Flag通常使用在从Service中启动Activity的场景,由于在Service中并不存在Activity栈,所以使用该Flag来创建一个新的Activity栈,并创建新的Activity实例Intent.FLAG_ACTIVITY_SINGLE_TOP
: 使用singleTop模式来启动一个ActivityIntent.FLAG_ACTIVITY_CLEAR_TOP
: 使用singleTask模式来启动一个ActivityIntent.FLAG_ACTIVITY_NO_HISTORY
: 使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中
5. 清空任务栈
可以在AndroidMainifest文件中的标签中使用以下几种属性来清理任务栈
clearTaskOnLaunch
: 通过这个属性,可以让这个Task每次初始化的时候,都只有这一个ActivityfinishOnTaskLaunch
: 通过这个属性,当离开这个Activity所处的Task,那么用户再返回时,该Activity就会被finish掉alwaysRetainTaskState
: 如果将Activity的这个属性设置为True,那么该Activity所在的Task将不接受任何清理命令,一直保持当前Task状态
6. Activity任务栈使用
如果过多地使用Activity任务栈,则会导致整个App的栈管理混乱