- 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
网友评论