ActivityManagerService 简称AMS:
AMS的总体结构图
image.png
主要负责Acitivity 的管理:
包括 :
- 1、对Activity 和系统之间的调度统一管理,
- 2、对activity运行的相关信息管理(Task,memory,Service)
- 3、进程管理
里面主要有3大数据
- ProcessRecord :
- StackRecord
- ActivityRecord
Activity调度的思路 :
A→B: AMS先会去暂停当前的Activity ,直到pauseComplete,检查B是否在历史栈中(由ActivityRecord 对象负责),如果在的话说明只需要 onResume,如果不在的话进行start
Activity 的4种启动模式 :
ActivityStackSupervisor ::startActivityUncheckedLocked 里面具体执行
1、检测launchFlags,
2、检测launchTaskBehind,确保 (!launchSingleTask && !launchSingleInstance)
3、如果是 :FLAG_ACTIVITY_NEW_TASK,无论如何都会启动一个新的TASK
4、检测Task 是否在栈顶
5、检查非Activity 启动 的任务(检测context,和flag)
6、对于singleTop(栈顶只有一个实例),只要栈顶不是要启动任务,都会创建一个新的,加入到栈顶;如果栈顶已经存在任务,则调用onNewIntent();
7、对于 SingleTask,表示在在内存共享一个实例,如果实例存在栈,调用了该对象,会执行onNewIntent(),并且实例置顶。
8、对于SingleInstance,有可能独占一个栈,在内存共享一个实例,无论实例在某一个栈中,只要有激活,就会进入该栈的实例,置顶。其他的task 与他不在同一个栈中,
LaunchMode 可以有Intent Activity 启动标志替代
1:FLAG_ACTIVITY_NEW_TASK
taskAffinity:每一个Activity都可以配置一个taskAffinity,如果配置文件里面没有配置,则系统默认用App的包名作为值。
image.png
We have a conflict between the Intent and the Activity manifest, manifest wins.
如果Intent 的flag 和 manifest launchmode 有冲突,则用manifest中的。
如果affinity值 相同,会压到相同栈中,否则新开辟一个栈。
2:FLAG_ACTIVITY_SINGLE_TOP: ===== singleTop
FLAG_ACTIVITY_CLEAR_TOP会清空实例栈顶的实例,进入onNewIntent 一般与FLAG_ACTIVITY_NEW_TASK配合使用。
4.FLAG_SINGLE_TASK需要注意:
对于在App内部的 ActivityA-→ActivityB (singleTask)-→ActivityC
1.默认情况下,ActivityB 是不会新开一个栈,和ActivityA保持同一个栈,因为默认情况下所有的Activity 的TaskAffinity值都是想同的,都是包名.
2.设置了ActivityB的TaskAffinity值和包名不一致,才会新开一个栈.
3.两个不同app的TaskAffinity值相同,他们的SingleTask的Activity会在同一个栈.
Single_Task在同任务中具有唯一性.
5.Single_Instance:
1.被其他任何Activity 开启都会新开辟一个栈.
2.被singleInstance开启的Activity 如果是TaskAffinity 和singleInstance的一致则在同一个栈,如果不一致则新开栈.
网友评论