Activity启动流程

作者: 小彤花园 | 来源:发表于2019-01-18 00:29 被阅读142次

    引言

    Activity启动流程很多文章都已经说过了,这里说一下自己的理解。

    涉及到的概念

    • 进程:Android系统中每个APP都是一个进程
    • IPC:跨进程通信

    涉及到的类

    • ActivityStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
    • ActivitySupervisor:管理activity任务栈
    • ActivityThread:UI线程,App的真正入口。
    • ApplicationThread:用来实现AMS和ActivityThread之间的交互。
    • ApplicationThreadProxy:ApplicationThread在服务端的代理。AMS就是通过该代理与ActivityThread进行通信的。
    • AMS:负责管理四大组件和进程,包括生命周期和状态切换。AMS因为要和ui交互,所以极其复杂,涉及window。
    • AMN:运行在server端(SystemServer进程)。实现了Binder类,具体功能由子类AMS实现。
    • AMP:AMS的client端代理(app进程)。了解Binder知识可以比较容易理解server端的stub和client端的proxy。AMP和AMS通过Binder通信。
    • Instrumentation:仪表盘,负责调用Activity和Application生命周期。

    流程图

    涉及到的进程

    • Launcher所在的进程
    • AMS所在的SystemServer进程
    • 要启动的Activity所在的app进程

    具体流程

    • Launcher:Launcher通知AMS要启动activity。
      • startActivitySafely->startActivity->Instrumentation.execStartActivity()(AMP.startActivity)->AMS.startActivity
    • AMS:PMS的resoveIntent验证要启动activity是否匹配。
      • 如果匹配,通过ApplicationThread发消息给Launcher所在的主线程,暂停当前Activity(Launcher);
    • 暂停完,在该activity还不可见时,通知AMS,根据要启动的Activity配置ActivityStack。然后判断要启动的Activity进程是否存在?
      • 存在:发送消息LAUNCH_ACTIVITY给需要启动的Activity主线程,执行handleLaunchActivity
      • 不存在:通过socket向zygote请求创建进程。进程启动后,ActivityThread.attach
    • 判断Application是否存在,若不存在,通过LoadApk.makeApplication创建一个。在主线程中通过thread.attach方法来关联ApplicationThread。
    • 在通过ActivityStackSupervisor来获取当前需要显示的ActivityStack。
    • 继续通过ApplicationThread来发送消息给主线程的Handler来启动Activity(handleLaunchActivity)。
    • handleLauchActivity:调用了performLauchActivity,里边Instrumentation生成了新的activity对象,继续调用activity生命周期。

    参考函数流程

    Activity启动流程(从Launcher开始):
    Step1~Step5: Step1-Step5通知ActivityManagerService要启动新的Activity了(在Launcher所在进程执行)。

    • Step1: Launcher.startActivitySafely
    • Step2:Activity.startActivity
    • Step3:Activity.startActivityForResult
    • Step4:Instrumentation.execStartActivity
    • Step5:ActivityManagerProxy.startActivity

    Step6~Step12: Step6-Step12通知Launcher程序应该pause Launcher的Activity了(在ActivityManagerService所在进程执行)

    • step6:ActivityManagerService.startActivity
    • step7:ActivityStack.startActivityMayWait
    • step8:ActivityStack.startActivityLocked :检查有没有在AndroidManifest中注册
    • step9:ActivityStack.startActivityUncheckedLocked, ActivityStack.startActivityLocked :startActivityUncheckedLocked判断是否需要创建一个新的任务来启动Activity。
    • step10:ActivityStack.resumeTopActivityLocked :获取栈顶的activity,并通知Launcher应该pause掉这个Activity以便启动新的activity
    • step11:ActivityStack.startPausingLocked
    • Step 12. ApplicationThreadProxy.schedulePauseActivity

    Step13~Step17: pause Launcher的Activity,并通知ActivityManagerService已经pause结束了(在Launcher所在进程执行)

    • step13:ApplicationThread.schedulePauseActivity
    • step14:ActivityThread.queueOrSendMessage
    • step15:H.handleMessage
    • step16:ActivityThread.handlePauseActivity
    • step17:ActivityManagerProxy.activityPaused

    Step18~Step23 创建一个新进程,调用ActivityThread.main方法(执行在ActivityManagerService进程)

    • step18:ActivityManagerService.activityPaused
    • step19:ActivityStack.activityPaused
    • step20:ActivityStack.completePauseLocked
    • step21:ActivityStack.resumeTopActivityLocked
    • step22;ActivityStack.startSpecificActivityLocked
    • step23:ActivityManagerService.startProcessLocked

    step18-step23:创建一个新进程,调用ActivityThread.main方法(执行在ActivityManagerService进程)。这其中,ActivityManagerService会先检查目标Activity所需的应用进程是否存在,如果存在,就直接通知这个进程,在该进程中启动Activity,否则,会先调用Process.start创建一个新的应用程序进程。
    注:这里就是与在同一个进程中启动Activity的区别之处

    Step24~Step25: 创建ActivityThread实例,初始化一些数据,进入Loop循环(执行在新创建的进程)

    • step24:ActivityThread.main
    • step25:ActivityManagerProxy.attachApplication

    Step26~Step29: 处理新的应用进程发出的创建进程完成的通信请求,并通知新应用程序进程启动目标Activity组件(执行在ActivityManagerService进程)

    • step26:ActivityManagerService.attachApplication
      step27:ActivityManagerService.attachApplicationLocked
    • step28:ActivityStack.realStartActivityLocked
    • step29:ApplicationThreadProxy.scheduleLaunchActivity

    Step30~Step35: 加载MainActivity类,调用onCreate声明周期方法(执行在新进程)

    • step30:ApplicationThread.scheduleLaunchActivity
    • step31:ActivityThread.queueOrSendMessage
    • step32:H.handleMessage
    • step33:ActivityThread.handleLaunchActivity
    • step34:ActivityThread.performLaunchActivity
    • step35:MainActivity.onCreate

    参考文章

    http://gityuan.com/2016/03/12/start-activity/
    https://blog.csdn.net/luoshengyang/article/details/6689748

    相关文章

      网友评论

        本文标题:Activity启动流程

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