AMS(ActivityManagerService)源码分析
-
两个核心:ActivityStack,ActivityTask
-
startActivity的intent匹配情况:
- 匹配到的目标对象所在程序包已经有其他元素在运行,通知该进程加载指定Activity
- 目标对象所属程序未运行,AMS先启动它的一个实例,然后运行其目标Activity
-
startActivity流程:
- Activity1(Context)->startActivity@ContextImpl->execStartActivity@Instrumentation->startActivity@AMS
-
AMS的startActivity流程:
-
ActivityManagerService:
- startActivity :其实就是调用startActivityAsUser
- startActivityAsUser:将userId传入,做调用者的隔离检查和权力检查,通过后调用startActivityMayWait@ActivityStack
-
ActivityStack:
-
startActivityMayWait :
- 是否显式
- 不是显式则需要调用resolveActivity()查找
- 是否重量级进程(重量级的进程一般是指在整个系统唯一存在一个进程,不会正常走保存恢复机制,而是一直运行在后台,不会被后台杀死,因此需要用户显示退出进入该进程。)
- 调用startActivityLocked@ActivityStack
- 函数结果写入outResult
函数中的wait就是体现在outResult这个地方
-
startActivityLocked
- 确保caller也就是调用者本身的进程是存在的,否则返回START_PERMISSION_DENIED错误
- 处理标志FLAG_ACTIVITY_FORWARD_RESULT(跨越式传递),A3的result会传给最初的A1
- resultCode判断->排除A2的startActivityResult
- Intent未找到或ActivityInfo为空,报错返回
- 权限检查,未通过返回SecurityExcepiton
- 生成ActivityRecord记录判断结果,调用startActivityUncheckedLocked@ActivityStack
Android源码中许多带有Locked标志的函数都是提醒使用者要保证函数的线程安全,它们涉及不可重入资源的处理。
-
startActivityUncheckedLocked
- 取出Intent中的启动标志flag
- FLAG_ACTIVITY_NO_USER_ACTION处理,检测是否主观意愿启动,调用者是否指示resume
- START_FLAG_ONLY_IF_NEEDED检查,启动对象和调用对象为同一个,则不重复操作
- 是否启动新Task,启动新Task情况下无法返回结果值
- 不启动新Task的情况下,调用findTaskLocked找到符合的Task,也就是栈顶Activity所在Task
- 是否需要清理整个Task(FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR同时存在),是否为FLAG_ACTIVITY_CLEAR_TOP,清理目标Activity以上的元素等等 对应四种启动模式
- 调用startActivityLocked(2),里面有newTask的判断。
-
-
-
startActivity流程图:
AMS中的startActivity流程.png
网友评论