Activity显示流程 - 安卓R

本文详细解析了Android中Activity从启动到显示的过程,包括通过context.startActivity启动Activity、SystemServer创建ActivityRecord、执行StartingWindow显示流程、Activity生命周期回调、View添加流程、Surface创建及绘制流程、以及StartingWindow销毁流程。

本文对Activity从启动到显示出来的流程做一个总结。

一般Activity是通过context.startActivity方法启动的,这个方法会触发ATMS启动Activity流程,在SystemServer创建相应的ActivityRecord对象。

接下来SystemServer会通过Activity生命周期调用流程去要Activity进入resume状态,并在此时执行StartingWindow显示流程,在app显示出来前先显示一个StartingWindow

在app这边会通过Activity的启动流程创建Activity对象和PhoneWindow对象,通常在Activity的onCreate方法中调用setContentView方法后会创建DecorView对象。

在Activity执行onResume了后,会调用WindowManager.addView方法,执行View的添加流程,创建ViewRootImpl对象,并在SystemServer这边创建WindowState窗口对象。

安卓的窗口管理系统将所有的窗口相关对象都放到一个树的数据结构中管理,WindowState就是之前创建的ActivityRecord的一个子节点,详见WindowContainer结构

接下来app通过View的Surface创建流程创建一个Surface准备绘图,同时也会通过SurfaceFlinger中Layer的创建流程在SurfaceFlinger中创建对应的Layer

创建Surface的时候SystemServer还会执行窗口布局流程

有了Surface后,app执行View的绘制流程进行绘图,安卓有一套HWUI绘制流程使用skia、opengl、vulkun等api进行绘图,并可以使用gpu进行硬件加速。

app在绘制完第一帧后会执行StartingWindow销毁流程,从而让StartingWindow消失。

绘图完成后Surface可以通过BufferQueue机制将绘制的图像传给SurfaceFlinger中对应的Layer,并通过SurfaceFlinger中Layer的合成流程将图像合成并显示到屏幕上。

Android 中,Activity 启动流程回调到 ClientTransactionHandler 的过程如下: 首先,发送消息给 ActivityThread.H,经过一系列调用,获取到启动 Activity 的所有数据,之后回到 ActivityThread 中执行 handleLaunchActivity 方法 [^3]。 在 androidThread 中的 H 类收到消息 RELAUNCH_ACTIVITY 后会调用 handleRelaunchActivityLocally 方法,在该方法的最后调用了 executeTransaction [^2]。 另外,Android 9.0 引入了 ClientLifecycleManager 和 ClientTransactionHandler 来辅助管理 Activity 生命周期。通过 ClientLifecycleManager(ActivityThread 的父类)的 scheduleTransaction() 方法把 PauseActivityItem 事件加入到执行计划中,开始栈顶的 pausing 过程。实际上 ActivityThread 调用的 scheduleTransaction() 方法是其父类 ClientTransactionHandler 的方法 [^1][^4]。 以 LauncherActivityItem 类为例,其 execute 方法中创建了 ActivityClientRecord 对象,并调用了 client(即 ClientTransactionHandler)的 handleLaunchActivity 方法 [^5]。 ```java // 示例代码,展示 LauncherActivityItem 的 execute 方法 @Override public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart"); ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo, mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState, mPendingResults, mPendingNewIntents, mIsForward, mProfilerInfo, client); client.handleLaunchActivity(r, pendingActions, null /* customIntent */); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSSxCCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值