首先罗列一些相关的名词
ActivityManagerService-----它是管理所有应用的最高级api,作用主要有三个,(1)统一调度各应用的activity.(2)内存管理(3)进程管理。 每次启动一个activity都要在它里面的 processRecord成员变量里面添加信息
ProcessRecord-------有称数据进程类,每个应用对应一个进程(远程进程除外),每个进程就是由这个类来管理
List<ActivityRecord> activities--------这是ProcessRecord里面的成员变量,每次打开新的activity就会在这里面添加一个以便管理
ActivityRecord -------------里面主要是activity的一些信息,所在的进程,线程,是否处于启动状态等等
-------------------------------------以上是和startActivity()也就是启动一个活动的前期准备工作---------------------------
执行完 前期准备工作后会回调activiy的onCreate()方法,进而执行setContentView(),此时重点正式开始,一次为突破口来解析一些类的原理
Window---是一个抽象类,可以将其理解为一个载体,View必须在这个载体上才能展示出来
PhoneWindow---------Window的实现类,它里面主要有一个继承自FrameLayout的内部类DecorView,并将DecorView的实例作为窗口的主VIew
DecorView-----继承自FrameLayout,是PhoneWindow的内部类,如果说Window是画板,那么他就是画纸,布局文件就是画的内容,有addView()来显示需要展示的activity
ViewRoot---------他其实是一个Handler,主要进行SMS的Client端(也就是app端)和Server端(手机操作系统端)的通信,比如我要把一个应用关闭,需要通过ViewRoot发送信息给操作系统让他把AMS里面的ProcessRecord里面的ActiivtyRecord从activities里面删掉
=============
View-----所有的界面都是View,包括各种控件,各种layout
ViewGroup-----用来管理View的一个VIew的集合Layout就是ViewGroup,(一般布局文件中都会有很多子布局,并且可以设置子布局的样式等等)
执行流程总结
当执行到Activity里面的setContentView得时候,其实会调用Activity类里面的mWindow(PhoneWindow实例)的setContentView(),根据源码会发现,PhoneWindow里面有一个DecorView实例,PhoneWindow的setContentView()里面就是先用LayoutInflater取出一路传过来的.xml布局文件的View实例,再将这个View实例通过DecorView的addView()添加到DecroView里面,这样页面上就显示出了我们需要的结果。
参考资料:http://www.myexception.cn/android/1792465.html
http://www.cppblog.com/fwxjj/archive/2013/01/13/197231.html