美文网首页
2.3 - 从Launcher启动应用

2.3 - 从Launcher启动应用

作者: Wi1ls努力努力再努力 | 来源:发表于2019-07-10 09:09 被阅读0次
  • Launcher 向 AMS 发送启动 ActivityA 的请求,参数传递 Launcher 进程的 ApplicationThread,ActivityClientRecord。
  • AMS 根据传递的 Intent 从 PMS 查询 ResolveInfo,进而得到目标 ActivityA 的详细资料 ActivityInfo
  • 获得发起者即 Launcher 的 ProcessRecord
  • 为目标 ActivityA 创建一个对应的 ActivityRecord
  • 将目标 ActivityA 对应的 ActivityRecord mHistory 的顶端
  • 从 mHistory 获得最上面的还未 finish 的 Activity 对应的 ActivityRecord,在此处便对应 Launcher 对应的 ActivityRecord(如果没有的话,就是执行 Home 应用的启动)
  • 然后AMS用 Launcher 对用的 ApplicationThread 通知 Launcher,将 Launcher 对应的 Activity 执行 pause 操作,同时向本进程的 handler 发送一个延时时间,防止目标进程操作超时。
  • 当 Launcher 对应的进程执行完 pause 操作后,会通知 AMS 已经将对应的 Activity 执行了 paused 操作(ActivityManagerNative.getDefault( ).activityPaused(token, state))
  • 当 AMS 收到请求后,从 mHistory 中获得 paused 的 ActivityRecord,同时 remove 前面发送的超时通知。
  • 随后就会尝试去启动目标 ActivityA。此时发现目标 ActivityA 对应的 APP 尚未启动,接下来则会为 ActivityA 启动一个进程。
  • 随后调用 Process.start( ) 启动一个新的进程。最终利用 zygote 孵化一个子进程,而后从新进程的ActivityThread.main( )作为入口函数
  • ActivityA 对应的新进程的 main( )@ActivityThread 中会初始化 Looper,实例化该进程对应的 ActivityThread 包括 ApplicationThread 这个通讯 Binder,同时会执行 attach( )@ActivityThread
  • 在 attach( )@ActivityThread中,会向 AMS 请求 attachApplication( )方法,并将本进程中的 ApplicationThread 做为参数传递。然后实例化 Instrumentation 和 Application 上下文 Context并且执行 Application.onCreate( )初始化。
  • AMS 会将这个 ApplicationThread 的 Proxy 保存在AMS 端该进程对应的 ProcessRecord 中,然后利用 ApplicationThread 的 Proxy 向应用程序发送bindApplication( )
  • 随后目标进程的 ActivityThread会进程一些形如上下文初始化的初始化的工作。
  • AMS 在发送 binderApplication( )的同时,会发送一个scheduleLaunchActivity( )的请求给应用端的 ApplicationThread
  • 应用端根据AMS 传递的信息,实例化目标 ActivityA,为其创建上下文并且执行 attach( )@Activity,然后执行 onCreate( )@Actvity, onStart( )@Activity,onPostCreate( )@Activity, onResume( )@Activity
  • 于是目标 Activity 就启动了

在 mHistory 中,相同的 Task 的 Activity 会相邻保存。而且最新的 Task 组会保存在之前的 Task 上面


Q: onStop( )的调用官方说明是在 Activity 对于用户不可见的时候发生的回调。之前在 AMS 找了半天没找到调用合理实际。感觉和 WMS 有关。后面再来看

相关文章

网友评论

      本文标题:2.3 - 从Launcher启动应用

      本文链接:https://www.haomeiwen.com/subject/murfkctx.html