- AMS启动Activity流程,依此调用以下函数:
- startActivity@ActivityManagerService
- startActivtyAsUser@ActivityManagerService
- startActivityMayWait@ActivityStack
- startActivityLocked(1)@ActivityStack,ActivityStack中参数较多的一个startActivityLocked
- startActivityUncheckedLocked@ActivityStack
- startActivityLocked(2)@ActivityStack,ActivityStack中参数较少的一个startActivityLocked
- startActivity中调用startActivityAsUser,通过Binder机制加入调用者用户ID,对调用者进行权限检查
- startActivityAsUser调用startActivityMayWait,
- 确定目标Activity
- 对于显示Intent,Intent信息中已带有Activity信息,可直接获得
- 对于隐式Intent,通过resolveActivity()查找
- 判断目标Activity所属进程是否是heavy-weight(?)
- 调用startActivityLocked
- 将startActivityLocked返回结果写入outResult,此时有可能需要等待
- 确定目标Activity
- startActivityLocked(1)
- 确保调用者进程存在,若出现被系统杀死或异常退出等情况则返回错误
- 处理FLAG_ACTIVITY_FORWARD_RESULT,进行跨越传递,如activity1通过activity2启动activity3,将activity3的调用者修改为activity1,结果返回到activity1
- 找到合适的目标Activity则继续,没有则报错返回
- 检查调用者权限
- 生成ActivityRecord变量记录当前各判断结果,并调用startActivityUncheckedLocked
- startActivityUncheckedLocked对启动模式与Intent标志的处理
- 得到Intent中启动标志信息,如是否用户主观启动、是否需要resume等
- 判断是非是需要启动,如果调用者与目标对象为同一个则不需要重复启动
- 判断是非需要启动新的task:若启动新task则不能跨越task返回启动结果,此时返回RESULT_CANCELED,然后根据目标activity的启动模式细化启动的新task。
- 启动startActivityLocked(2)
- startActivityLocked
- 若不是新task,从已有的task中找出包含目标Activity的task(遍历列表),注册但不启动。
- 将目标Activity放置于stack最顶层,从而可以与用户交互
- 如需要的话执行切换动画
- 向wms添加目标Activity的appToken
- 检查新task是否存在affinity相符的其它Activity
- 调用resumeTopActivityLocked,恢复最上层activity与pause前的activity
9.25
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 什么是任务栈(Task) 官方文档是这么解释的 任务是指在执行特定作业时与用户交互的一系列 Activity。 这...