Activity的栈&&四种启动模式
导语
我们知道,手机系统上一般会打开多个app,而每个app又会有多个activity,那么如何管理这些activity就成了一个问题。
这篇博客就先介绍如何管理activity,再介绍activity的四种启动模式(以及不同启动模式下,如何管理activity以及如何实现跳转)。
Android系统如何管理activity
ActivityManagerService,AMS
AMS是系统在开机启动时所启动的一个独立的进程。一个系统只有一个AMS,与app之间通过IPC机制进行跨进程通信。
Process
系统默认为每个app提供一个process进程资源(但是也可以申请多个)。
ActivityStack
ActivityStack是AMS管理Activity实例的栈,也是只有一个。它管理协调ActivityRecord和TaskRecord以及所有的任务栈。
ActivityTask
ActivityTask是任务栈。不同于ActivityStack只能有一个,ActivityTask可以有多个。系统中所有的activity在面向用户时可能分成多个组,就是按照task来组织的。
它也叫BackStack回退栈,在一个Task栈里一直按Back键,就会不断回退到上一个Activity(包括其他App的Activity),直到回退至Home,所以,用户感知到的Activity界面回退逻辑,是由Task栈决定的,管理Activity的回退跳转逻辑,其实就是管理Task任务栈。
四种启动模式
启动模式是针对于ActivityTask来说的,而并不是ActivityStack。
它主要指明了一个activity的实例是否可复用以及如何复用。
启动模式可以在manifest文件中定义,也可以在intent中用代码动态赋值(例如添加FLAG_ACTIVITY_SINGLE_TOP标识,等同于设置singleTop属性),默认是standard。
standard
不复用。
当需要某个activity的实例时,不管之前是否创建过该activity的实例,直接创建一个新实例。
可能存在一个activity的多个实例。
singleTop
栈顶复用。
当需要某个activity的实例时,检查当前任务栈的栈顶是否是该activity的实例。
如果是,直接复用;否则,新建一个实例。
可能存在一个activity的多个实例。
singleTask
栈内复用
当需要某个activity的实例时,检查当前任务栈中是否存在该activity的实例。
如果存在,则将其前面的activity出栈,然后复用;否则,新建一个实例。
只可能存在一个activity的一个实例。
singleInstance
单例模式
该activity的实例独享一个任务栈,且该activity只有这一个任务栈,只有这一个实例。
只可能存在一个activity的一个实例。
图解
activity复用的生命周期
正常启动一个activity实例,是onCreate->onStart->onResume->… …
而复用一个已存在的activity实例,是onNewIntent->onRestart->onStart-> onResume->… …
更多关于activity生命周期的问题,可以参考Activity的生命周期详解。