参考别人的分享,总结了一下代码的调用流程,做了一下笔记
startActivity() -> startActivityForResult() -> mInstrumentation.execStartActivity() ->
ActivityManager.getService().startActivity(),会通过Binder机制,调用到ActivityManagerService
的startActivity()方法。
ActivityManagerService{
startActivity() -> startActivityAsUser() -> ActivityStarter.startActivityMayWait()
}
ActivityStarter{
startActivityMayWait() -> startActivityLocked() -> startActivity() ->
经辗转调用ActivityStackSupervisor.realStartActivityLocked() ->
IApplicationThread.scheduleLaunchActivity() 通过Binder机制,调用到
ApplicationThread.schedulelaunchActivity()
}
看一下 ActivityThread.ApplicationThread.schedulelaunchActivity()
schedulelaunchActivity() -> 通过Handler机制,发送消息sendMessage(H.LAUNCH_ACTIVITY, r)
-> handleLaunchActivity()
-> performLaunchActivity(){
mInstrumentation.newActivity() 使用类加载器,类名通过反射,创建Activity对象
makeApplication(){
Instrumentation.newApplication() 使用类加载器,类名通过反射,创建Application对象
callApplicationOnCreate() -> app.onCreate()
}
activity.attach() 创建了窗口对象PhoneWindow
Instrumentation.callActivityOnCreate() -> activity.performCreate() ->
调用Activity的onCreate()
}
调用Activity的onCreate() 一个Activity 也就启动了。
startActivity方法会调用到startActivityForResult方法 ,然后会调用Instrumentation的exeStartActivity方法, 会通过Binder机制,调用到AMS 的startActivity()方法,接下来就是服务端的操作了,在服务端经辗转调用ActivityStackSupervisor的realStartActivityLocked() ,在该方法,和之前客户端调用服务端类似,通过Binder机制,会使ApplicationThread$scheduleLaunchActivity方法被调用。于是,基于Binder机制,又实现了一次进程间的通信,将启动Activity的操作交给了ActivityThread的内部类ApplicationThread类。之后通过Handler 机制,发送消息sendMessage(H.LAUNCH_ACTIVITY, r) ,在handleMessage() 调用handleLaunchActivity() ,然后里面有个performLaunchActivity() 调用Instrumentation 的newActivity() 使用反射,创建Activity 对象,之后在Instrumentation 的callActivityOnCreate() 回调Activity 的onCreate() 。
参考:https://blog.csdn.net/h55l55/article/details/80434154