Android View的加载过程

来源:互联网 发布:软件配置管理规定 编辑:程序博客网 时间:2024/05/21 11:30

文章来源: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对象来实现的。





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 沈阳上一休一更夫招聘 我愿意我是一个更夫 更始帝 淡极始知花更艳 太始 正始 什么让生活更美好作文400字 诚信让生活更美好六年级500字 科技让生活更美好作文500字 运动让生活更美好500字作文 梦想让生活更美好作文400字 梦想生活更美好作文400字 科技让生活更美好600字 诚信生活更美好作文400字 科技让生活更美好400字 诚信让生活更美好作文400字 运动让生活更美好作文400字 读书让生活更美好作文500字 让生活更美好作文400字 诚信让生活更美好400字作文 阅读让生活更美好作文500字 种花让生活更美好作文600字 运动让生活更美好作文600字 美食让生活更美好500字 阅读让生活更美好作文600字 阅读生活更美好作文600字 诚信让生活更美好作文600字 种花让生活更美好作文400字 诚信生活更美好作文600字 微笑让生活更美好400字 梦想让生活更美好400字 花让生活更美好作文600字 微笑让生活更美好作文600字 爱让生活更美好作文600字 微笑生活更美好作文600字 科技让生活更美好作文600字 科技生活更美好作文600字 梦想让生活更美好作文600字 旅行让生活更美好作文600字 运动让生活更美好作文500字 梦想让生活更美好作文500字