Activity启动流程

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。

你可能感兴趣的:(技术分享,Android)