Android8.0 Activity 启动流程

参考别人的分享,总结了一下代码的调用流程,做了一下笔记

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值