View加载

View加载流程:

View随着Activity的创建而加载,startActivity启动一个Activity时,在ActivityThread的 handleLaunchActivity方法中先调用Activity的attach方法初始化PhoneWindow实例, 然后会执行Activity的onCreate方法,这个时候会调用setContentView加载布局 创建出DecorView并将我们的layout加载到DecorView中,当执行到handleResumeActivity时,Activity的onResume方法被调用,然后WindowManager会将DecorView设置给ViewRootImpl。这样,DecorView就被加载到Window中了,此时界面还没有显示出来,还需要经过View的measure,layout,和 draw方法,才能完成View的工作流程。我们需要知道View的绘制是由ViewRoot来负责的,每一个DecorView都有一个与之关联的ViewRoot,这种关联关系是由WindowManager维护的,将DecorView 和 ViewRoot关联之后,ViewRootImpl的requestLayout会被调用以完成初步布局,通过scheduleTraversals方法,这个方法会执行View的measure, layout 和 draw流程。

 

AppCompatDeleagate

mDelegate = AppCompatDelegate.create

mDelegate.setContentView

AppCompatDelegateImplBase、AppCompatDelegateImplV9

@Override

public void setContentView(int resId){

    ensureSubDecor();

    ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);

    contentParent.removeAllViews();

    LayoutInflater.from(mContext).inflate(resId, contentParent);

    mOriginalWindowCallback.onContentChanged();

}

 

private ViewGroup mSubDecor;

activity.getWindow

 

mWindow是定义在Activity中的一个全局变量,mWindow赋值是在Activity方法中完成的。

Window是Android里面的一个抽象类,而PhoneWindow是Window的唯一的实现类。

PhoneWindow构造方法中很重要的一个全局变量,mDecor,这个是DecorView类的实例。那么mDecor = (DecorView) preservedWindow.getDecorView();这个方法是给DecorView赋值的。

 

Activity在调用attach时就会初始化PhoneWindow

mWindow = new PhoneWindow(this, window, activityConfigCallback);

Activity的attach是在performLaunchActivity中被调用的,也就是在ActivityThread中被调用。所以在Activity中任何时候getWindow(),都能得到PhoneWindow。

 

Activity启动流程:

我们可以从Context的 startActivity说起,其实现 是ContextImpl的 startActivity,然后内部会通过 Instrumentation 来尝试启动Activity,这是一个跨进程过程,它会调用AMS的startActivity方法,当AMS校验完activity的合法性后,会通过ApplicationThread回调到我们的进程,这也是一次跨进程过程,而ApplicationThread就是一个binder,回调逻辑是在binder线程池中完成的,所以需要通过Handler将其切换到ui线程,会收到消息------LAUNCH_ACTIVITY,它对应handleLaunchActivity,在这个方法里完成了Activity的创建和启动。接着,在activity的onResume中,activity的内容开始渲染到window上,然后开始绘制直到我们能看到。

 

 

第一个消息:H.BIND_APPLICATION

handleBindApplication()

反射得到 Instrumentation

Instrumentation会在应用程序的任何代码运行之前被实例化,可以用它来监测应用程序 和 系统的所有交互。每一个activity都会持有instrumentation的引用,但是整个进程只有一个instrumentation实例,instrumentation相当于一个大管家,管理着activity 和 application的生命周期,包括activity的创建。

Instrumentation的execStartActivity方法

通过ActivityThread,Instrumentation会来执行activity的生命周期方法以及创建activity,那么ActivityThread又是哪个类通知的呢???是AMS,也就是ActivityManagerService。

AMS通过Binder通信告诉ActivityThread,该创建一个activity了,那么ActivityThread就会调用Instrumentation来创建一个activity。

ActivityManagerNative.getDefault()返回的是ActivityManagerService的远程接口-------ActivityManagerProxy。

ActivityManagerNative.getDefault().startActivity()则利用Binder进行通信,把所有参数数据封装在Parcel对象中,然后通过binder对象的transact方法传输到AMS。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值