Activity的启动流程
开发中我们会调用startActivity来启动一个Activity,最终会调到 startActivityForResult :
Instrumentation 是Android系统里面的一套控制方法或者“钩子”。这些钩子可以在正常的生命周期(正常是由操作系统控制的)之外控制Android控件的运行。
Application和Activity的所有生命周期中,都会先调用Instrumentation提供的相应方法(如callActivityOnCreate,callApplicationOnCreate,newActivity,callActivityOnNewIntent)
Instrumentation.execStartActivity
ActivityTaskManager.getService()返回了一个IActivityTaskManager,拿到的是ATMS的代理对象,跨进程调用了ATMS的startActivity方法。
ActivityStarter.startActivityMayWait
ActivityStarter中做了一系列的调用(收集Intent信息,处理startActivityForResult,做一些校验判断等),最终进入startActivityUnchecked。
startActivityUnchecked
startActivityUnchecked中处理了关于Activity启动模式的处理,接着真正的resume我们的Activity
这里会先判断应用进程是否创建,创建了就进入 realStartActivityLocked ,没创建就会调用 ActivityManagerInternal.startProcess
①热启动realStartActivityLocked
接着看ActivityThread中接收并处理消息的handleMessage
前面realStartActivityLocked方法中通过addCallback,传入参数LaunchActivityItem。executeCallbacks方法中取出callbacks集合中的LaunchActivityItem,并调用其execute方法
handleLaunchActivity
②冷启动创建应用进程ActivityManagerInternal.startProcess
ActivityManagerInternal的实现类是AMS中的LocalService,AMS通过Socket与Zygote通信,fork出App进程,app进程创建后,会执行ActivityThread的main方法(Android进程入口方法)
调用ActivityThread的attach
[4]thread.bindApplication 这是一个binder通信的过程
ActivityThread内部的Handler接收到BIND_APPLICATION消息
回到上面attachApplicationLocked的mAtmInternal.attachApplication,调用ATMS的attachApplication
看到了似曾相识的realStartActivityLocked,后面流程和之前一样。Activity启动流程分析完毕。
总结
1)与Activity管理有关的类:
ActivityRecord :历史栈中的一个条目,代表一个Activity
TaskRecord :内部维护了一个ArrayList<ActivityRecord> ,来保存ActivityRecord
ActivityStack :内部维护了一个ArrayList<TaskRecord>,用来管理TaskRecord
ActivityStackSupervisor :用来管理ActivityStack的
2)Activity启动流程