一,启动模式分类:
Standard(标准模式,默认)
SingleTop(栈顶复用模式)
SingleTask(栈内复用模式)
SingleInstance(单实例模式)
通过AndroidManifest可配置Activity的LaunchMode.如果没有配置,默认是Standard模式。
taskAffinity属性,可设置Activity的栈。默认是当前包名。此属性仅适用于后三种启动模式。
二,ADB命令
我们通过ADB的命令,就可以直观的看到当前系统内Activity的栈结构。
具体命令如下:
从Display #0 (activitys from top to bottom)下面我们能够看出有两个Stack栈。从字面意思我们也可以看出从上到下是有两个栈的,其中栈顶的Stack #1从包名就能看出里,是我测试用的栈。
而Stack #0能看出来是从桌面图标启动,所以可以认为是系统桌面Activity的栈。
从上面我们可以看出来Activity的存储结构分为三层:
栈(Stack),栈中可以有多个任务记录,这个栈我们可以认为是一个进程的栈,以包名来区分吧。
任务记录(TaskRecord),也是栈结构,后进先出。任务记录里面有多个ActivityRecord
Activity记录(ActivityRecord),我们可以理解为就是一个Activity
三,Standrd模式(标准启动模式)
标准启动模式就是没有特殊配置的Activity。该启动模式下会一直创建Activity并将该Activity压入TaskRecord中。
示例:
MainActivity下有两个按钮,一个用来调起他自己。一个用来调起TestAActivity。都是Standrd模式。
adb记录如下
我们连续三次调用MainActivity,然后在调用TestAActivity。我们发现MainActivity不停的被创建,然后被压入一个TaskRecord。
该TaskRecord有一个标识 #610 A=org.wangchenlong.wcl_activity_launchmode_demo。
从记录中我们就能发现Standrd模式的特点就是会一直创建Activity.并且将它压入启动他的Activity所在的TaskRecord中。
四,SingleTop(栈顶复用模式)
解释:只有当Activity位于栈(TaskRecord)顶的时候,再次启动当前的Activity,复用栈顶的Activity实例。不会重复创建。如果位于栈(TaskRecord)内(中间位置),则与标准模式相同,仍然会重新创建实例。
示例:
MainActivity -> TestAActivity -> TestBActivity -> TestBActivity -> TestBActivity。其中TestBActivity是SingleTop模式。