47.Android View的加载过程 (转)
2016-03-23 18:50
746 查看
[b]原文地址:/article/1361169.html[/b]
大家都知道Android中加载view是从Activity的onCreate方法调用setContentView开始的,那么View的具体加载过程又是怎么的呢?这一节我们做一下分析。
首先追踪一下代码:
Activity中:
[java] view plain copy
print?
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:
[java] view plain copy
print?
// sPolicy为Policy对象,实现了接口IPolicy
public static Window makeNewWindow(Context context) {
return sPolicy.makeNewWindow(context);
}
再看Policy类中的代码
[java] view plain copy
print?
// 这里就是返回了一个PhoneWindow对象
public PhoneWindow makeNewWindow(Context context) {
return new PhoneWindow(context);
}
从而可知 Activity中的setContentView 最终调用的是PhoneWindow类中的 setContentView.
[java] view plain copy
print?
@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的[b]PhoneWindow的内部类。[/b]
installDecor()中的代码:
[java] view plain copy
print?
if (mContentParent == null) {
mContentParent = generateLayout(mDecor);
再看generateLayout:
[java] view plain copy
print?
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对象来实现的。
大家都知道Android中加载view是从Activity的onCreate方法调用setContentView开始的,那么View的具体加载过程又是怎么的呢?这一节我们做一下分析。
首先追踪一下代码:
Activity中:
[java] view plain copy
print?
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:
[java] view plain copy
print?
// sPolicy为Policy对象,实现了接口IPolicy
public static Window makeNewWindow(Context context) {
return sPolicy.makeNewWindow(context);
}
再看Policy类中的代码
[java] view plain copy
print?
// 这里就是返回了一个PhoneWindow对象
public PhoneWindow makeNewWindow(Context context) {
return new PhoneWindow(context);
}
从而可知 Activity中的setContentView 最终调用的是PhoneWindow类中的 setContentView.
[java] view plain copy
print?
@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的[b]PhoneWindow的内部类。[/b]
installDecor()中的代码:
[java] view plain copy
print?
if (mContentParent == null) {
mContentParent = generateLayout(mDecor);
再看generateLayout:
[java] view plain copy
print?
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对象来实现的。
相关文章推荐
- android 之View 一
- Android Fragment 真正的完全解析(上)
- 破解Android或IOS游戏包时,将原本的黑白图(png文件),彩色图(jpg)文件,合成为一张png文件
- github开源Android资源整理(十三)大神个人和组织
- Android Manager
- android:layout_weight属性的工作原理
- android的抽屉控件SlidingDrawer的使用
- Android官方开发文档Training系列课程中文版:支持不同的设备之支持不同的语言
- Android 常用的适配器总结
- Android Studio如何引入依赖包
- DRM in Android
- 一种TV(Android系统)通用焦点框的实现
- Android 之小技巧
- Andrroid四大组件之Activity生命周期
- Android控件之Toolbar + DrawerLayout的使用
- Android项目:手机安全卫士(16)—— 复杂 ListView
- Android自动化构建之Ant多渠道打包实践(下)
- iOS与Android的音频互通
- Android序列化:Parcelable/Serializable
- Android的webview加载本地html、本apk内html和远程URL