9.25

  • 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,此时有可能需要等待
  • 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)