Activity启动模式
Activity启动模式–AndroidManifest.xml
- 默认模式(Strandard)
每次启动都会创建一个新的Activity。
2.栈顶复用(SingleTop)
如果启动的Activity栈顶已经存在,就不用创建。如果没有或者不在栈顶,就创建一个新的。
【不存在】
启动AActivity
[存在]
启动BActivity
- 栈内复用(SingleTask)
启动AActivity,如果栈内已存在AActivity,会弹出AActivity之上所有的Activity。
- 单独的任务栈中(SingleInstance)
启动的Activity会在单独的任务栈中创建
动态设置标志位启动
-
FLAG_ACTIVITY_NEW_TASK 跟launchMode中的singleTask一样。
-
FLAG_ACTIVITY_SINGLE_TOP 跟launchMode中的singleTop一样。
-
FLAG_ACTIVITY_CLEAR_TOP 跟launchMode中的singleTask一样。
动态设置的启动模式要比Manifest中设置的优先级要高。
Activity管理过程
众所周知,Activity的管理和生命周期的调用,依赖于AMS。AMS如何管理Activity呢?
Activity在AMS对应的是ActivityRecord.
【ActivityRecord】
用来描述Activity信息,定义了Activity所有属性
名称 | 类型 | 说明 |
---|---|---|
service | ActivityManagerService | 目前AMS的引用 |
info | ActivityInfo | 主要记录了Activity在Manifest文件中的配置信息 |
launchedFromPid | int | 启动Activity进程的pid |
launchedFromUid | int | 启动Activity进程的uid |
taskAffinity | String | Activity启动后所在的task |
task | TaskRecord | 记录了所在task的信息 |
app | ProcessRecord | 记录了Activity启动所在进程的信息 |
state | ActivityState | 当前Activity的状态 |
theme | int | Activity的主题 |
【TaskRecord】
管理Activity任务栈,
名称 | 类型 | 说明 |
---|---|---|
taskId | final int | 任务栈的唯一标识 |
affinity | String | 任务栈的名称,也就是taskAffinity配置的名称 |
intent | Intent | 启动这个任务栈的Intent |
mActivities | ArrayList | 按照在任务栈中历史顺序排序的Activity |
mStack | ActivityStack | 任务栈所在的Activity栈 |
mService | ActivityManagerService |
【ActivityStack】
有两种Stack,mHomeStack对应Launcher.mFocuseTask对应的是正在运行的
名称 | 类型 | 说明 |
---|---|---|
mService | ActivityManagerService | 目前AMS的引用 |
mRecentTasks | RecentTasks | 记录一个最近使用的Activity列表 |
mPausingActivity | ActivityRecord | 目前停止状态的Activity信息 |
mResumedActivity | ActivityRecord | 目前resume状态的Activity信息 |
【ProcessRecord】
ProcessRecord是关于应用进程的描述。
名称 | 类型 | 说明 |
---|---|---|
uid | int | 进程的uid |
processName | String | 进程名称 |
info | ApplicationInfo | 记录应用程序信息 |
== 【ActivityStackSupervisor】 ==
管理ActivivityStack
AMS Activity启动流程图
来源:https://blog.csdn.net/gongdy/article/details/102729598