• 47.Android View的加载过程 (转)


    原文地址:http://blog.csdn.net/xyz_lmn/article/details/20122303

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

    首先追踪一下代码:

    Activity中:

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public void setContentView(int layoutResID) {  
    2.     getWindow().setContentView(layoutResID);  
    3. }  
    4.   
    5. public Window getWindow() {  
    6.     return mWindow;  
    7. }  
    8.   
    9. final void attach {  
    10.     mWindow = PolicyManager.makeNewWindow(this);  
    11. }  

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

    PolicyManager:

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. // sPolicy为Policy对象,实现了接口IPolicy  
    2.     public static Window makeNewWindow(Context context) {  
    3.         return sPolicy.makeNewWindow(context);  
    4.     }  


    再看Policy类中的代码 

     

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. // 这里就是返回了一个PhoneWindow对象  
    2. public PhoneWindow makeNewWindow(Context context) {  
    3.         return new PhoneWindow(context);  
    4.     }  



     

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

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. @Override  
    2.    public void setContentView(int layoutResID) {  
    3.        if (mContentParent == null) {  
    4.            installDecor();  
    5.        } else {  
    6.            mContentParent.removeAllViews();  
    7.        }  
    8.        mLayoutInflater.inflate(layoutResID, mContentParent);  
    9.        final Callback cb = getCallback();  
    10.        if (cb != null && !isDestroyed()) {  
    11.            cb.onContentChanged();  
    12.        }  
    13.    }  

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

    installDecor()中的代码:

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. if (mContentParent == null) {  
    2.             mContentParent = generateLayout(mDecor);  


    再看generateLayout:

     

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. protected ViewGroup generateLayout(DecorView decor) {  
    2.   
    3.        View in = mLayoutInflater.inflate(layoutResource, null);  
    4.        decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));  
    5.   
    6.  }  



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

     

  • 相关阅读:
    个人作业—软件评测
    结对第二次作业——某次疫情统计可视化的实现
    结对第一次—某次疫情统计可视化(原型设计)
    软工实践寒假作业(2/2)
    寒假规划作业(1/2)
    【图像处理】利用双线性插值算法进行图像的缩放
    只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果
    js中运算符优先级问题
    微信、QQ中app的下载问题
    浅述html5和web app
  • 原文地址:https://www.cnblogs.com/benchao/p/5312422.html
Copyright © 2020-2023  润新知