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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容