captura 录制出来的是黑屏_《Activity显示界面历险记》—说说View的那些理不清的关系...

前言

在Activity显示View的过程中,有一些重要的角色总让人理不清,比如PhoneWindow、DecorView、ViewRootImpl。

也常常有面试题会问到,他们四者之间的关系?创建的时机?View第一次绘制的时机?等问题。

那么今天,就和大家一起从Activity启动开始 看看 到展示出View整个过程中,到底会经过哪些步骤,这之间各角色的关系又如何。

动画展示

为了方便大家理解,先通过动画的形式给大家展示这几位的关系:

ca4838918a14

image

源码解析

从小爱诞生说起

在Activity界面展示之前,它还是个我们看不到的Activity,我给它起了个爱称——小爱.

小爱是怎么诞生的呢?熟悉Activity启动流程的都知道,小爱的创建发生在performLaunchActivity中:

//ActivityThread.java

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

//创建ContextImpl

ContextImpl appContext = createBaseContextForActivity(r);

Activity activity = null;

try {

java.lang.ClassLoader cl = appContext.getClassLoader();

//创建Activity

activity = mInstrumentation.newActivity(

cl, component.getClassName(), r.intent);

}

try {

if (activity != null) {

//完成activity的一些重要数据的初始化

activity.attach(appContext, this, getInstrumentation(), r.token,

r.ident, app, r.intent, r.activityInfo, title, r.parent,

r.embeddedID, r.lastNonConfigurationInstances, config,

r.referrer, r.voiceInteractor, window, r.configCallback,

r.assistToken);

//调用activity的onCreate方法

if (r.isPersistable()) {

mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);

} else {

mInstrumentation.callActivityOnCreate(activity, r.state);

}

}

}

return activity;

}

这个过程中,主要做了三件事:

Activity被实例化出来

调用了attach方法进行初始化

调用onCreate方法开始从布局文件加载布局,做View显示的准备工作。

给小爱找个和View交互的帮手(PhoneWindow)

大家也都知道,小爱在被创建后,事务繁忙,肯定不能亲力亲为得管理每个View,所以他就找了一个帮手,帮助她和View交互,管理View。

(Activity和View的解耦)

这个帮手是啥呢?就是窗口Window,也就是实现类PhoneWindow了。

这个过程发生在

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值