Activity的绘制流程简单分析(基于android 4.0源码进行分析)
2015-07-02 16:44
543 查看
要明白这个流程,我们还得从第一部开始,大家都知道 在activity里面 setcontentview 调用结束以后 就可以看到程序加载好我们的布局文件了,从而让我们在手机上看到这个画面。
那么我们来看一下这个源码是如何实现的。
[Java] 纯文本查看 复制代码
?
我们这里看到是调用了getwindow的返回值 来调用setcontentview 方法的。
[Java] 纯文本查看 复制代码
?
我们再来看看mWindow 这个值是从哪来的。
[Java] 纯文本查看 复制代码
?
注意看11行的代码 我们发现这个mWindow的值 是通过 makeNewWindow这个方法来实现的。我们再来看看这个方法,当然了我们要先找到这个类,这个类位于
<ignore_js_op>
![](http://www.apkbus.com/data/attachment/forum/201506/16/105137hcjfe0g9co50zbkp.jpg)
[Java] 纯文本查看 复制代码
?
这里发现是一个反射的动态加载,我们暂时不去深究他,继续看代码,找到Policy这个类,他位于<ignore_js_op>
![](http://www.apkbus.com/data/attachment/forum/201506/16/105236otbbwbqlq6e3wqez.jpg)
[Java] 纯文本查看 复制代码
?
看62行代码,到这里我们就发现了 在activity里 getwindow 返回的 实际上就是这个phonewindow对象!!!!!!!!!!!!!!我们继续看这个phonewindow类 他位于<ignore_js_op>
![](http://www.apkbus.com/data/attachment/forum/201506/16/105236v1jcc88vq1f1ybjc.jpg)
注意在这里我就不放这个类的源码了,因为2000多行。。。我只抽部分重要的说一下
[Java] 纯文本查看 复制代码
?
看22和23行代码 我们就知道 这个DectorView 就是我们绘制view的时候 最顶层的那个view。换句话说就是最根部的视图。
而且 再继续跟代码 我们会发现 他就是phonewindow的一个内部类 注意看他是继承的framelayout
[Java] 纯文本查看 复制代码
?
所以到这里我们可以发现 在activity里调用setconteview的时候 最终就是调用的phonewindow的这个方法
[Java] 纯文本查看 复制代码
?
这里代码其实也很好理解,如果是第一次调用就installDecor 否则就remove所有的view 我们来看这个installdector的代码
[Java] 纯文本查看 复制代码
?
注意看第八行代码 这个就是绘制activity根布局最关键的地方 这个函数一共有300行左右 我也不能全部放上来,有兴趣的同学可以自己看一下源码,我在这截取部分重要的说。
其实重要的代码就是这么一些
[Java] 纯文本查看 复制代码
?
这个layoutResource的值 实际上就代表了窗口修饰的哪些布局文件,你看最后两行代码就知道
当我们确定了这个布局文件以后就把她add 到decor这个对象里。
所以我们就能想明白 为啥 我们的requestWindowFeature这个方法一定要在setContentview前面调用才有作用了~~
然后给大家随便看下布局文件吧,就是系统自带的这些跟布局。
<ignore_js_op>
![](http://www.apkbus.com/data/attachment/forum/201506/16/105237vttrqlmq7u4touqu.jpg)
这种大家肯定经常用了,就是上面有个标题 然后下面就放我们自己的布局文件来展示内容
当然了还有人喜欢用全屏的screen_simple,他的代码也是很简单的。这里不截图上代码
[XML] 纯文本查看 复制代码
?
那 注意 33行代码 android:id="@android:id/content" 这个地方跟我们上一张的博客 那边有一样的地方,都是用的这个id content为根布局的,有兴趣的同学可以看看我们view教程05的结尾部分,
两个串起来看就能明白了~~~
然后看一下这个函数 另外一个重要的代码
[Java] 纯文本查看 复制代码
?
返回值是contentParent 而他的值实际上就是我们那个布局文件里装内容的android id content,很好理解吧
所以generateLayout这个函数的作用就是 确定一下我们activity的显示风格还有把content这个framelayout的值
给mContentParent,然后通过第8行的代码就把我们的布局文件添加到这个freamlayout里了。
[Java] 纯文本查看 复制代码
?
最终由ActivityManagerService 这个类还显示我们的decorview。
最后我们再把前面的流程简单复述一下
启动一个activity的时候,我们最终是调用的phonewindow的setcontent方法 ,这个方法会创建一个decorview对象
然后再过一遍窗口属性这个流程,最后取得android id content 这个framelayout,然后将布局文件添加到这个framelayout里面
最后由activitymanagerservice负责把这个最终的界面展示出来~~~
自定义view 07 将会讲一下view的绘制流程~
那么我们来看一下这个源码是如何实现的。
[Java] 纯文本查看 复制代码
?
[Java] 纯文本查看 复制代码
?
[Java] 纯文本查看 复制代码
?
<ignore_js_op>
![](http://www.apkbus.com/data/attachment/forum/201506/16/105137hcjfe0g9co50zbkp.jpg)
[Java] 纯文本查看 复制代码
?
![](http://www.apkbus.com/data/attachment/forum/201506/16/105236otbbwbqlq6e3wqez.jpg)
[Java] 纯文本查看 复制代码
?
![](http://www.apkbus.com/data/attachment/forum/201506/16/105236v1jcc88vq1f1ybjc.jpg)
注意在这里我就不放这个类的源码了,因为2000多行。。。我只抽部分重要的说一下
[Java] 纯文本查看 复制代码
?
而且 再继续跟代码 我们会发现 他就是phonewindow的一个内部类 注意看他是继承的framelayout
[Java] 纯文本查看 复制代码
?
[Java] 纯文本查看 复制代码
?
[Java] 纯文本查看 复制代码
?
其实重要的代码就是这么一些
[Java] 纯文本查看 复制代码
?
当我们确定了这个布局文件以后就把她add 到decor这个对象里。
所以我们就能想明白 为啥 我们的requestWindowFeature这个方法一定要在setContentview前面调用才有作用了~~
然后给大家随便看下布局文件吧,就是系统自带的这些跟布局。
<ignore_js_op>
![](http://www.apkbus.com/data/attachment/forum/201506/16/105237vttrqlmq7u4touqu.jpg)
这种大家肯定经常用了,就是上面有个标题 然后下面就放我们自己的布局文件来展示内容
当然了还有人喜欢用全屏的screen_simple,他的代码也是很简单的。这里不截图上代码
[XML] 纯文本查看 复制代码
?
两个串起来看就能明白了~~~
然后看一下这个函数 另外一个重要的代码
[Java] 纯文本查看 复制代码
?
所以generateLayout这个函数的作用就是 确定一下我们activity的显示风格还有把content这个framelayout的值
给mContentParent,然后通过第8行的代码就把我们的布局文件添加到这个freamlayout里了。
[Java] 纯文本查看 复制代码
?
最后我们再把前面的流程简单复述一下
启动一个activity的时候,我们最终是调用的phonewindow的setcontent方法 ,这个方法会创建一个decorview对象
然后再过一遍窗口属性这个流程,最后取得android id content 这个framelayout,然后将布局文件添加到这个framelayout里面
最后由activitymanagerservice负责把这个最终的界面展示出来~~~
自定义view 07 将会讲一下view的绘制流程~
相关文章推荐
- 【Android】状态栏通知Notification、NotificationManager详解
- Android了解四大基本组件
- Android Studio开发JNI工程
- android studio中空文件夹是否折叠
- Android照片墙应用实现,再多的图片也不怕崩溃
- Android开发规范
- Android Bitmap详细介绍
- Android高效加载大图、多图解决方案,有效避免程序OOM
- 提升Android应用开发性能的十大要点
- android开发下的一些技术要点
- Android 开源框架Universal-Image-Loader完全解析(三)---源代码解读
- Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
- Android.mk简介
- android studio 如何正确导入jar
- Android动画之LayoutAnimationController
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- Android 虚拟按键驱动实现
- Android.mk添加第三方jar包
- Android Studio开发入门-引用jar及so文件
- Android开发中java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullPoi