1.按下Launcher桌面图标以后,laucher会调用startActivitySafety(),解析v.getTag = shortCut,得到相关信息,然后调用Activity类中的startActivity();
2.startActivity()最终会调用startActivityForResult()方法,requestCode = -1;
3.startActivityForResult()方法会调用mInstrumention.execStartActivity();
4.Class Instrumention {
execStartActivity(){
ActivityManagerService.startActivity();
checkStartActivityResult();//检查启动结果是否成功
}
}
5.Class ActivityMangerService{
startActivity(){
pause之前的Activity,
(Laucher发现没有任务栈,创建新任务栈,发现没有进程,则创建新进程,并执行activityThread.main()方法,然后application.attatch();)
一系列复杂调用最后,
ApplicationThread.scheduleLauchActivity();
}
}
6.Class ApplicationThread (是AtivityThread的内部类,并且实现了BINDER){
scheduleLauchActivity(){
//发送H(是个handler) Message;
sendMessage(H.LAUNCH_ACTIVITY,runnable);
}
}
7.Class ActivityThread {
private Class H extends Handler {
handleMessage(){
switch(){
case:LAUNCH_ACTIVITY
performLaunchActivity();
}
}
}
}
8.performLaunchActivity(){
1.从ActivityClientRecord中获取带启动的activity组件信息;
2.通过Instrumention的newActivity方法,用类加载器创建Activity对象(反射);
3.如果没创建Application,那么LoadedApk创建Application,实际也是Instrumention创建的;
4.创建ContextImpl,并通过activity.attach()完成数的初始化;
}
9.activity.attach()中建立window并关联;
10.mInstrumention.callActivityOncreate(){
完成activity的创建,并调用activity的onCreate()方法;
}
11.activity.oncreate(){
setContentView();
}
12.setContentView() -> window.setContentView(){
创建DecorView
并用layoutInflater.inflate(layoutId,mContentParent)解析xml布局(采用Pull解析),
将解析到的布局数据添加到DecorView中
此时,一直到Activity的onCreate方法结束,仅仅是解析到布局数据,并没有开始绘制View的流程
}
13.ActivityThread.handleResumedActivity(){
activity.onResume(){
makeVisible(){
window.addView(deorView);
这个时候布局才真正开始绘制并显示出来
}
}
}
一、Android Launcher 启动 Activity 的工作过程
1.Instrumentation从字面上来看是仪器盘的意思,具体到程序中是管理activity的一个工具类,
包括创建和启动Activity(实际上,创建和启动Activity是由Instrumentation调用ActivityManagerService(AMS)完成的,该结论待讨论),activity的生命周期方法都是由Instrumentation这个仪器来控制,一个进程中只用一个Instrumentation实例。
2.ActivityThread通过内部类ApplicationThread来进行进程间通讯。
比如Launcher启动一个Activity,那么AMS就可以通过ApplicationThread找到Launcher进行通信。
3.ActivityThread通过ApplicationThread与AMS通讯。ApplicationThread通过H与ActivityThread通讯,处理Activity事务。
比如:ActivityThread通过ApplicationThread和AMS进行进程间通信,AMS以进程通讯的方式来完成ActivityThread的请求后调用ApplicationThread中的Binder方法, 然后ApplicationThread会向H发送消息,H收到消息后会将ApplicationThread中的逻辑切换到ActivityThread中去执行,即切换到主线程中去执行,这个过程就是主线程的消息循环模型。
注意:ActivityThread并不是一个线程Thread,它是final类并且无继承或者实现其它类,它的作用就是在main方法内消息循环,处理主线程事务。
4.ContextImpl是Context的具体实现,Context中的大部分逻辑都是由ContextImpl来完成的。ContextImpl是通过Activity的attach方法来和Activity建立关联的,
除此之外,在attach方法中Activity还会完成Window的创建并建立自己和Window的关联,这样当Window接收到外部输入事件后就可以将事件传递给Activity。