http://blog.csdn.net/luoshengyang/article/details/6689748 这个是老罗对于android启动流程进行的代码跟踪讲解,非常的细致全面, 我是继续跟踪到界面初始化完成
1. 在启动Activity的时候, ActivityThread 类中的 scheduleLaunchActivity 方法会被调用
2. 然后会发送一个Handler what == LAUNCHER_ACTIVITY
3.然后会走 handlerLauncherActivity 方法 , 方法内调用performLauncherActivity 创建一个Activity
4.performLauncherActivity 方法内会加载Activity 并通过attach方法 对activity进行初始化
5.performLauncherActivity方法内attch被调用
6.最后 performLauncherActivity方法内调用 activity的oncreate()方法
7. 在activity的oncreate方法中我们都会进行setcontentview 来设定activity的布局, 接下来我们跟踪setcontentview方法
8. Activity中的setcontentview() 会被调用 , 然后会调用getwindow方法, 然后将layout设置给返回对象,那么这个对象是谁呢? 接着跟
9.看到返回的是一个window类型,这个时候需要注意的是在activity的时候有一个方法被调用用来初始化activity的方法attach, 也就是第5步内容,然后看一下attach方法
10. 可以看到返回的mWindow是一个PhoneWindow对象, 然后我们继续跟踪PhoneWindow的setcontentview方法
11.这里有一个方法是installDecor
12. generateDecor方法
13. 这里new了一个DecorView 是PhoneWindow的内部类, 那DecorView 是个什么东东呢
14. DecorView 原来是FrameLayout的子类, decorview创建完成后,在11部还会调用generatelayout的方法, 这个方法跟踪了解到是初始化一些属性
15. 这样一个DecorView创建完成了 然后 我们继续跟踪 第10部 里面有一个方法 mLayoutInflater.inflate(layoutResID, mContentParent);
将我们setcontentview设置的layoutid 和 刚刚创建好的 decorview 传递进去了 , 跟踪一下这个方法
...
可以看出来是解析xml并且实例化 添加到decorview中, 也就是说 我们写的布局都存在于这个decorview上面了, 那么它是怎么被显示出来的呢
16. 在启动流程中 handlerLauncherActivity 方法中 handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed); 这个方法被调用了
这个方法中的代码块(可在第3 步中的图片看到这个方法)
看到了吧 方法中将我们刚刚初始化完成的decorview , 通过windowmanager的addview 传递过去了,这个时候 其实就能够显示在手机上了, 本着不求甚解的精神再继续跟一下
17. 其实这个windowmanager用的是一个windowmanager的实现类windowmanagerImpl
18.跟踪windowmanagerImpl的addview方法
19. 看到将view添加到 mGlobal了 这个mGlobal是什么东东呢 是WindowManagerGlobal类 , 并且查看一下addview的方法
20.查看WindowManagerGlobal 的 addview方法, 方法内会创建一个 viewrootimpl , 并且通过viewrootimpl的setview方法将decorview传递给了viewrootimpl
21. 接下来跟踪viewrootimpl的setview方法
方法内会调用 requestLayout();
22. 继续跟踪 requestLayout方法
方法内对于进行了decorview的 测量 布局 和绘制工作 并且这些方法 都是不断向下递归的, 这样view树就被建立起来了
到这基本上activity的创建 到现实 都完成了