- 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
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 什么是任务栈(Task) 官方文档是这么解释的 任务是指在执行特定作业时与用户交互的一系列 Activity。 这...