为了账号安全,请及时绑定邮箱和手机立即绑定

Android View的加载过程(转)

标签:
Android

大家都知道Android中加载view是从Activity的onCreate方法调用setContentView开始的,那么View的具体加载过程又是怎么的呢?这一节我们做一下分析。


首先追踪一下代码:

Activity中:

public void setContentView(int layoutResID) {
    getWindow().setContentView(layoutResID);
}
public Window getWindow() {
    return mWindow;
}
final void attach {
    mWindow = PolicyManager.makeNewWindow(this);
}

**

* @author 张兴业

*  http://blog.csdn.net/xyz_lmn

Activity在调用onCreate()之前会调用attach()初始化mWindow,这篇文章中,我们先不管attach()是谁调用的,也不管他是怎么被调用的。只分析一下view的加载过程。下面是PolicyManager方法:

PolicyManager:

// sPolicy为Policy对象,实现了接口IPolicy
    public static Window makeNewWindow(Context context) {
        return sPolicy.makeNewWindow(context);
    }


再看Policy类中的代码 

// 这里就是返回了一个PhoneWindow对象
public PhoneWindow makeNewWindow(Context context) {
        return new PhoneWindow(context);
    }


从而可知 Activity中的setContentView 最终调用的是PhoneWindow类中的 setContentView.

 @Override
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        mLayoutInflater.inflate(layoutResID, mContentParent);
        final Callback cb = getCallback();
        if (cb != null && !isDestroyed()) {
            cb.onContentChanged();
        }
    }


installDecor()初始化了DecorView、mContentParent还有title(3.0以后的ActionBar)。DecorView是继承自FrameLayout的PhoneWindow的内部类。

   installDecor()中的代码:


if (mContentParent == null) {
            mContentParent = generateLayout(mDecor);
if (mContentParent == null) {
            mContentParent = generateLayout(mDecor);


再看generateLayout:


  protected ViewGroup generateLayout(DecorView decor) {
        View in = mLayoutInflater.inflate(layoutResource, null);
        decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
  }


从上面的代码看出,加载的视图添加到了DecorView上,这样Activitty加载视图的过程就完成了。试图加载过程中出现了Activity、Window、View。Activity是Android应用程序的载体,允许用户在其上创建一个用户界面,并提供用户处理事件的API,如onKeyEvent, onTouchEvent等, 并维护应用程序的生命周期。每一个Activity组件都有一个关联的Window对象,用来描述一个应用程序窗口。每一个应用程序窗口内部又包含有一个View(DecorView)对象,用来描述应用程序窗口的视图。应用程序窗口视图是真正用来实现UI内容和布局的,也就是说,每一个Activity组件的UI内容和布局都是通过与其所关联的一个Window对象的内部的一个View对象来实现的。


5be975bf0001c4ab08440392.jpg

原文链接:http://www.apkbus.com/blog-623357-58643.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消