AMS内核笔记

2017-12-30  本文已影响13人  浩林Leon

ActivityManagerService 简称AMS:

AMS的总体结构图


image.png

主要负责Acitivity 的管理:
包括 :

里面主要有3大数据

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
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的一致则在同一个栈,如果不一致则新开栈.

上一篇下一篇

猜你喜欢

热点阅读