Android UI绘制流程分析(一)Activity.setContentView与DecorView之间的关系

源码版本Android 6.0请参阅:http://androidxref.com/6.0.1_r10本文目的是分析从Activity启动到走完绘制流程并显示在界面上的过程,在源码展示阶段为了使跟踪代码逻辑更清晰会省略掉一部分非主干的代码,具体详细代码请翻阅源码。本次不赘述Activity启动流程中的更早时机,对于更早的如何通过binder回调到Activity Thread的这些流程我计划后续再出一篇文章分析,如果不了解可参考这位作者的这篇文章:https://www.jianshu.com/p/6
摘要由CSDN通过智能技术生成

源码版本Android 6.0
请参阅:http://androidxref.com/6.0.1_r10

本文目的是分析从Activity启动到走完绘制流程并显示在界面上的过程,在源码展示阶段为了使跟踪代码逻辑更清晰会省略掉一部分非主干的代码,具体详细代码请翻阅源码。

本次不赘述Activity启动流程中的更早时机,如果不了解可参考这位作者的这篇文章:Activity的启动过程分析

我们都知道Android中的应用程序入口其实是:ActivityThread的main方法,而不是很多人认为的Activity的onCreate方法。

在ActivityThread类中有一个名为H的内部类继承自Handler,H中的handleMessage()方法中处理了很多很多的消息请求,其中一个Activity启动时最终会回调到

#class in ActivityThread

public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
	    ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
	    CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
	    int procState, Bundle state, PersistableBundle persistentState,
	    List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
	    boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {
   
	
	updateProcessState(procState, false);
	
	// 创建一个Activity记录
	ActivityClientRecord r = new ActivityClientRecord();
	// 省略消息封装过程
	 ...
	// 最终向H发送LAUNCH_ACTIVITY事件,然后回调到H的handleMessage方法中处理
	sendMessage(H.LAUNCH_ACTIVITY, r);
}

在H中处理消息走到LAUNCH_ACTIVITY对应的分支回调到:

handleLaunchActivity(r, null);

看看该方法的实现:

#class in ActivityThread

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
   
   ...
    // Initialize before creating the activity
    // 初始化一个全局的WindowManagerGlobal对象,这个在接下去的篇幅中会用到
    WindowManagerGlobal.initialize();

	// 内部会调用到mInstrumentation.callActivityOnCreate(activity, r.state);方法回调Activity的onCreate方法
    Activity a = performLaunchActivity(r, customIntent);

    if (a != null) {
   
        ...
        // 进入onResume的处理流程并且内部开始做视图处理
        handleResumeActivity(r.token, false, r.isForward,
                !r.activity.mFinished && !r.startsNotResumed);
	...
    }
    ...
    // 保存所要启动的Activity对应的ActivityClientRecord对象
    mActivities.put(r.token, r);
}

在handleLaunchActivity方法中主要做了3件事:
1.初始化WindowManagerGlobal,其内部通过ServiceManager获取了WindowManagerService binder实例,这将在后续会用到。
2.执行performLaunchActivity方法加载Activity类到内存中并执行Activity的一些属性初始化和onCreate生命周期的回调等
3.执行handleResumeActivity方法进行ui的测绘渲染并回调onResume生命周期方法,至此Activity的内容就呈现给用户了。

至此做个分割线,因为下面的一套流程会分析的比较远,待会儿会回到这里来


先来看下performLaunchActivity的具体实现

#class in ActivityThread

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
   
    ..<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值