Activity启动流程浅析

一般情况下所说的Activity的启动有两种,
一种是复用,一种是新建。

也有说法分为laucher启动和Activity切换时的启动,本质是一样的:
在Activity未实例化之前,均需初始化,实例化后,就只需要改变栈中的状态即可。

这里的源码使用的是android-26

因为就Android本身的源码而言,太过冗杂,并且每个版本的源码都有一些差别,故而贴代码的作用不大,这里也就不贴出来了。
只把简单的图表给出来作为记载。

先上图,这是调用startActivity时所经的方法流程:
start1

调用startActivity的大致流程分为两步,

  1. 将当前栈顶的Activity状态置为onPause
  2. 将启动的Activity状态置为onResume,若尚未新建,则新建Activity实例并Resume

至于是怎么通过zygote进程fork出一个新的Activity实例的过程,可以找zygote相关的资料查看,这里暂且不提。

图中一些类的简要概念如表所示:

作用
InstrumentationActivity实例的委托代理者,每个Activity均持有此类引用,应用单例
ActivityManagerServiceActivity的管理服务端,Framework层的核心服务之一
ActivityStarterActivity的启动控制器,可通过判定状态与FLAG使用不同模式启动Activity
ActivityStackSupervisorActivity栈的管理者,主要用于监管与调整栈的状态
ActivityStackActivity栈
ActivityThreadActivity线程基类,应用的入口
ZygoteProcess应用孵化器,可与底层zygote进程进行通信实现应用层的孵化

抛开zygote不提,接着上面的新建Activity实例的流程,会再次由ActivityThread接手。无论是通过laucher点击应用,还是应用中切换Activity但目标Activity实例未初始化时,都需要ActivityThread接手新建并启动Activity实例。

新建Activity实例流程如下图:
start2

Activity的启动都是从ActivityStackSupervisor的realStartActivityLocked方法中真正开始的,这也是这个方法名的用意。

其实整个流程充斥着大量细节,但如果不是从事系统开发,也不必太过追究,只要知道ActivityThread、AMS、Instrumentation几个类是怎么控制Activity的,也就够了。

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值