Activity启动流程分析---Android(重点精华、必看必记)


阅读前言:欢迎评论、一起交流学习,如有错误及不足,望海涵,如这篇文章对您有用,麻烦帮忙点点小蛋糕,谢谢您的喜欢~


第一步:startActivity()-----activity.java

AMS核心 : 对Activity启动的管理

第二步:进入startActivityforResult()的mInstrumentation.execStarActivity()-----activity.java

第三步:进入Instrumentation类的execStartActivity()

(版本号小于9.0通过Binder跨进程执行)AMS----->startActivity()

(目前√ 版本号大于9.0通过Binder跨进程执行)ATM----->startActivity()

ATM如何获得?主播Kitty马上为你揭晓答案!

 第四步:跨进程进入ATM(AMS)服务的startActivity()(Binder方式)

ATM服务如何获得的?(揭晓答案)

(1)通过ActivityTaskManager.getService()进入ActivityTaskManager.java

(2)这里用到了代理模式!(重点)通过
final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
拿到ATM服务

(3)拿到ATM服务,通过ATM跨进程的方式,进入到ActivityTaskManagerService.java执行startActivity()

第五步:判断需要启动的Activity所在的进程是否已经启动(AMS中)

进程存在(直接启动):realStartActivityLocked()是热启动

进程不存在:mService.startProcessAsync();fork进程 是冷启动

第六步:如果进程不存在,AMS通过socket通知zygote进程fork反射创建一个新进程ActivityThread(Activity所需的进程)

第七步:通过ActivityThread的main方法中的attachApplication方法把APP进程的的applicationThread给到AMS

(1)attach

(2)拿到AMS----->跨进程调用AMS的Application,Activity通过attachApplication把applicationThread传给AMS(Binder方式)

第九步:AMS中执行realStartActivityLocked()

第十步:AMS拿到applicationThread发送scheduleLaunchActivity到APP进程(Binder方式)

第十一步:APP进程中执行ApplicationThread-------(发送消息H.LAUNCH_ACTIVITY---Handler方式)----->ActivityThread----------(handleLaunchActivity)--------->Activity.onCreate()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值