您的位置:首页 > 移动开发 > Android开发

Activity的绘制流程简单分析(基于android 4.0源码进行分析)

2015-07-02 16:44 543 查看
要明白这个流程,我们还得从第一部开始,大家都知道 在activity里面 setcontentview 调用结束以后 就可以看到程序加载好我们的布局文件了,从而让我们在手机上看到这个画面。

那么我们来看一下这个源码是如何实现的。

[Java] 纯文本查看 复制代码

?
我们这里看到是调用了getwindow的返回值 来调用setcontentview 方法的。

[Java] 纯文本查看 复制代码

?
我们再来看看mWindow 这个值是从哪来的。

[Java] 纯文本查看 复制代码

?
注意看11行的代码 我们发现这个mWindow的值 是通过 makeNewWindow这个方法来实现的。我们再来看看这个方法,当然了我们要先找到这个类,这个类位于

<ignore_js_op>


[Java] 纯文本查看 复制代码

?
这里发现是一个反射的动态加载,我们暂时不去深究他,继续看代码,找到Policy这个类,他位于<ignore_js_op>


[Java] 纯文本查看 复制代码

?
看62行代码,到这里我们就发现了 在activity里 getwindow 返回的 实际上就是这个phonewindow对象!!!!!!!!!!!!!!我们继续看这个phonewindow类 他位于<ignore_js_op>

注意在这里我就不放这个类的源码了,因为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>


这种大家肯定经常用了,就是上面有个标题 然后下面就放我们自己的布局文件来展示内容

当然了还有人喜欢用全屏的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的绘制流程~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: