从源代码理解调用OnCreate的路径
2016-04-10 21:47
357 查看
每个标题后的括号内容是 类到另一个类的跳转 。
一.(ActivityThread.main() -> Thread.attach() )
ActivityThread类是整个应用程序的入口,其中有个main方法;
二.(Thread.attach() -> ActivityManagerService .attachApplication() -> -> ActivityManagerService .attachApplicationLocked() )
然后我们进入到attach()方法中:
attach方法中会根据布尔值来分为系统应用和非系统应用
我们只看非系统应用:
可见ActivityManagerService 实现了IActivityManager接口,继承了ActivityManagerNative类,由getDefault()方法返回;
得到mgr后,attach中调用了mgr的attachApplication()方法;
接下来我们进入到ActivityManagerService类中看这个attachApplication方法:
这个方法中又调用了自身实例的attachApplicationLocked()方法;
三.( ActivityManagerService .attachApplicationLocked() -> Thread.bindApplication()&&ActivityManagerSupervisor.attachApplicationLocked() )
当然,接下来进入到attachApplicationLocked()中:
里面调用了Thread对象的bindApplication()方法;
以及ActivityManagerSupervisor类中的attachApplicationLocked()方法(这里注意和上面的ActivityMangerService的attachApplicationLocked()方法区别);
五.( ActivityManagerSupervisor.attachApplicationLocked() ->ActivityManagerSupervisor.realStartActivityLocked() ->ApplicationThread.scheduleLaunchActivity())
接着看ActivityManagerSupervisor.attachApplicationLocked()中的realStartActivityLocked方法;在里面,先配置Activity参数,接着调用ApplicationThread.scheduleLaunchActivity();
六.(ApplicationThread.scheduleLaunchActivity() -> H.handleLaunchActivity() )
scheduleLaunchActivity()中构造ActivityClientRecord对象并赋值给ActivityClientRecord对象中的域;最后发送一个标示为LAUNCH_ACTIVITY给H(Handler的子类);
七.(H.handleLaunchActivity() ->H.performLaunchActivity()-> Activity.performCreate() )
就这样进入了H中进行处理:
H中主要调用了handleLaunchActivity();而handleLaunchActivity()中主要调用的是performLaunchActivity();
在performLaunchActivity()中调用了Instrumentation类中的callActivityOnCreate();callActivityOnCreate()中调用了Activity类的performCreate()方法;
八.( Activity.performCreate() ->Activity.OnCreate())
最后的最后,就是Activity类中的OnCreate()方法;
一.(ActivityThread.main() -> Thread.attach() )
ActivityThread类是整个应用程序的入口,其中有个main方法;
public static void main(String[] args){ Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false); sMainThreadHandler = thread.getHandler();
二.(Thread.attach() -> ActivityManagerService .attachApplication() -> -> ActivityManagerService .attachApplicationLocked() )
然后我们进入到attach()方法中:
attach方法中会根据布尔值来分为系统应用和非系统应用
我们只看非系统应用:
IActivityManager mgr = ActivityManagerNative.getDefault();
可见ActivityManagerService 实现了IActivityManager接口,继承了ActivityManagerNative类,由getDefault()方法返回;
得到mgr后,attach中调用了mgr的attachApplication()方法;
接下来我们进入到ActivityManagerService类中看这个attachApplication方法:
这个方法中又调用了自身实例的attachApplicationLocked()方法;
三.( ActivityManagerService .attachApplicationLocked() -> Thread.bindApplication()&&ActivityManagerSupervisor.attachApplicationLocked() )
当然,接下来进入到attachApplicationLocked()中:
里面调用了Thread对象的bindApplication()方法;
以及ActivityManagerSupervisor类中的attachApplicationLocked()方法(这里注意和上面的ActivityMangerService的attachApplicationLocked()方法区别);
五.( ActivityManagerSupervisor.attachApplicationLocked() ->ActivityManagerSupervisor.realStartActivityLocked() ->ApplicationThread.scheduleLaunchActivity())
接着看ActivityManagerSupervisor.attachApplicationLocked()中的realStartActivityLocked方法;在里面,先配置Activity参数,接着调用ApplicationThread.scheduleLaunchActivity();
六.(ApplicationThread.scheduleLaunchActivity() -> H.handleLaunchActivity() )
scheduleLaunchActivity()中构造ActivityClientRecord对象并赋值给ActivityClientRecord对象中的域;最后发送一个标示为LAUNCH_ACTIVITY给H(Handler的子类);
七.(H.handleLaunchActivity() ->H.performLaunchActivity()-> Activity.performCreate() )
就这样进入了H中进行处理:
H中主要调用了handleLaunchActivity();而handleLaunchActivity()中主要调用的是performLaunchActivity();
在performLaunchActivity()中调用了Instrumentation类中的callActivityOnCreate();callActivityOnCreate()中调用了Activity类的performCreate()方法;
八.( Activity.performCreate() ->Activity.OnCreate())
最后的最后,就是Activity类中的OnCreate()方法;
相关文章推荐
- 《java并发编程实战》读书笔记一 可见性和重排序现象
- Eclipse插件开发中各种路径的获取(一)
- php中页面间传带+的数据出现空格问题
- [LeetCode]81. Search in Rotated Sorted Array II
- Java注解
- 蓝桥杯 -算法训练 区间k大数查询 java算法
- Spring中的设计模式
- c++类模板遇上static关键字
- c++函数模板和类模板
- java abstract类和interface的区别,精辟!
- java中静态代码块、静态方法、static关键字详解
- java基础(三),字符串
- c++友元函数及运算符重载
- Java Nio 十二、Java NIO DatagramChannel(数据报通道)
- c++第3次上机-2
- 20145322 《Java程序设计》第6周学习总结
- 轻量级javaee最后工作流项目总结
- c++ 时间函数全攻略
- 选择算法-GoLang实现
- Java的加载资源文件+JavaBean+内省机制