Activity启动流程(上)

作者: 莫库施勒 | 来源:发表于2019-02-17 02:00 被阅读0次
    新启动流程

    与之前不同的是添加了ActivityStartController, ActivityStarter , ClientLifecycleManager

    并且不同的状态是用的是 ActivityLifecycleItem,其子类有PauseActivityItem,LaunchActivityItem等,需要实现preExecute, execute,PostExecute 三个主要方法

    并且ActivityThread 继承了ClientTransactionHandler,在scheduleTransaction 中执行preExecute,并发送消息到H中,在TransactionExecutor中执行execute和postExecute,execute执行handle方法,postExecute执行相应的回调

    结构

    启动结构图

    具体过程

    1. Activity1调用startActivity,实际会调用Instrumentation类的execStartActivity方法,Instrumentation是系统用来监控Activity运行的一个类,Activity的整个生命周期都有它的影子。(1- 4)

    2. 通过跨进程的binder调用,进入到ActivityManagerService中,其内部会处理Activity栈,通知Activity1 Pause,Activity1 执行Pause 后告知AMS。(5 - 29)

    3. 在ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用Zygote的native方法forkAndSpecialize,执行fork任务。之后再通过跨进程调用进入到Activity2所在的进程中。(30 - 36)

    4. ApplicationThread是一个binder对象,其运行在binder线程池中,内部包含一个H类,该类继承于类Handler。主线程发起bind Application,AMS 会做一些配置工作,然后让主线程 bind ApplicationThread,ApplicationThread将启动Activity2的信息通过H对象发送给主线程。发送的消息是EXECUTE_TRANSACTION,消息体是一个 ClientTransaction,即 LaunchActivityItem。主线程拿到Activity2的信息后,调用Instrumentation类的newActivity方法,其内通过ClassLoader创建Activity2实例。(37 - 40)

    5. 通知Activity2去performCreate。(41 - 最后)

    注:现在发送的都是EXECUTE_TRANSACTION ,通过 TransactionExecutor 来执行 ClientTransaction, ClientTransaction 中包含各种 ClientTransactionItem,如 PauseActivityItem、LaunchActivityItem、StopActivityItem、ResumeActivityItem、DestroyActivityItem 等,这些Item的execute方法来处理相应的handle,如handlePauseActivity、handleLaunchActivity等,通知相应的Activity来perform。

    再盗一张图

    activity启动时的进程间通信方式

    启动流程下

    相关文章

      网友评论

        本文标题:Activity启动流程(上)

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