zoukankan      html  css  js  c++  java
  • Android View的加载过程


        大家都知道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);
    }
    

          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);

    再看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对象来实现的。





    /**
    * @author 张兴业
    *  http://blog.csdn.net/xyz_lmn
    *  android开发进阶群:281537853
    *  iOS入门群:83702688
    *  我的新浪微博:@张兴业TBOW
    */

  • 相关阅读:
    C#调试信息打印到输出窗口
    C#拼接SQL中in条件
    从图像到知识:深度神经网络实现图像理解的原理解析
    Cocoa Touch(六):App运行机制 NSRunLoop, KVC, KVO, Notification, ARC
    Cocoa Touch(五):网络请求 NSURLSession/AFNetworking, GCD, NSURLResquest
    JQuery:选择器、动画、AJAX请求
    Cocoa Touch(四): 多线程GCD, NSObject, NSThread, NSOperationQueue
    Socket、RPC通信实例,简单版本,仅供查阅
    Cocoa Touch(三):图形界面UIKit、Core Animation、Core Graphics
    Cocoa Touch(二):数据存储CoreData, NSKeyArchiver, NSOutputStream, NSUserDefaults
  • 原文地址:https://www.cnblogs.com/xyzlmn/p/3641702.html
Copyright © 2011-2022 走看看