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