捋一捋 Activity 的启动流程 以及 界面的初始化过程

http://blog.csdn.net/luoshengyang/article/details/6689748  这个是老罗对于android启动流程进行的代码跟踪讲解,非常的细致全面, 我是继续跟踪到界面初始化完成


1. 在启动Activity的时候, ActivityThread 类中的 scheduleLaunchActivity 方法会被调用

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第1张图片


2. 然后会发送一个Handler what == LAUNCHER_ACTIVITY


捋一捋 Activity 的启动流程 以及 界面的初始化过程_第2张图片


3.然后会走 handlerLauncherActivity 方法 , 方法内调用performLauncherActivity 创建一个Activity


捋一捋 Activity 的启动流程 以及 界面的初始化过程_第3张图片

4.performLauncherActivity  方法内会加载Activity 并通过attach方法 对activity进行初始化

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第4张图片


5.performLauncherActivity方法内attch被调用


捋一捋 Activity 的启动流程 以及 界面的初始化过程_第5张图片


6.最后 performLauncherActivity方法内调用 activity的oncreate()方法

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第6张图片


7. 在activity的oncreate方法中我们都会进行setcontentview 来设定activity的布局, 接下来我们跟踪setcontentview方法



8. Activity中的setcontentview() 会被调用 , 然后会调用getwindow方法, 然后将layout设置给返回对象,那么这个对象是谁呢? 接着跟





9.看到返回的是一个window类型,这个时候需要注意的是在activity的时候有一个方法被调用用来初始化activity的方法attach, 也就是第5步内容,然后看一下attach方法

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第7张图片


10. 可以看到返回的mWindow是一个PhoneWindow对象, 然后我们继续跟踪PhoneWindow的setcontentview方法

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第8张图片


11.这里有一个方法是installDecor

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第9张图片

12. generateDecor方法



13. 这里new了一个DecorView 是PhoneWindow的内部类, 那DecorView 是个什么东东呢



14. DecorView 原来是FrameLayout的子类, decorview创建完成后,在11部还会调用generatelayout的方法, 这个方法跟踪了解到是初始化一些属性


捋一捋 Activity 的启动流程 以及 界面的初始化过程_第10张图片


15. 这样一个DecorView创建完成了 然后 我们继续跟踪 第10部 里面有一个方法 mLayoutInflater.inflate(layoutResID, mContentParent);

将我们setcontentview设置的layoutid 和 刚刚创建好的 decorview 传递进去了 , 跟踪一下这个方法 

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第11张图片

 ...

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第12张图片

可以看出来是解析xml并且实例化 添加到decorview中, 也就是说 我们写的布局都存在于这个decorview上面了, 那么它是怎么被显示出来的呢


16. 在启动流程中 handlerLauncherActivity 方法中 handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed); 这个方法被调用了

这个方法中的代码块(可在第3 步中的图片看到这个方法)

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第13张图片

看到了吧 方法中将我们刚刚初始化完成的decorview , 通过windowmanager的addview 传递过去了,这个时候 其实就能够显示在手机上了, 本着不求甚解的精神再继续跟一下



17. 其实这个windowmanager用的是一个windowmanager的实现类windowmanagerImpl



18.跟踪windowmanagerImpl的addview方法



19. 看到将view添加到 mGlobal了 这个mGlobal是什么东东呢 是WindowManagerGlobal类 , 并且查看一下addview的方法


20.查看WindowManagerGlobal 的 addview方法, 方法内会创建一个 viewrootimpl , 并且通过viewrootimpl的setview方法将decorview传递给了viewrootimpl

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第14张图片


21. 接下来跟踪viewrootimpl的setview方法

方法内会调用   requestLayout();

捋一捋 Activity 的启动流程 以及 界面的初始化过程_第15张图片

22. 继续跟踪 requestLayout方法  


捋一捋 Activity 的启动流程 以及 界面的初始化过程_第16张图片

方法内对于进行了decorview的 测量 布局 和绘制工作  并且这些方法 都是不断向下递归的, 这样view树就被建立起来了

到这基本上activity的创建 到现实 都完成了




你可能感兴趣的:(Android开发)