关于AMS中Activity启动流程说明 本文基于android 15 源码编写

面对当前Android大环境,当前做出整理

1.Activity启动开始:

//源码位置:/frameworks/base/core/java/android/app/Activity.java


从源码上调用后走到了 startActivityForResult() 方法

接着走到了 Instrumentation.java 中的 execStartActivity 中

跳转到 Instrumentation.java 类中的 execStartActivity()

//源码位置在:/frameworks/base/core/java/android/app/Instrumentation.java

通过Binder 通讯,调用 AMS服务中 StartActivity() 查看AMS 中方法,共同实现了ActivityTaskManager 的调用,从这里可以体会到了Binder 的用处,具体还需要细细体悟了

AMS 源码位置:frameworks /base/services/core/java/com/android/server/am/ActivityManagerService.java

接下来就是AMS 的一系列操作了

在AMS中调用 startActivityAsUser()

从上图可以看出当前执行到了 getActivityStartController().obtainStarter() 中的execute() 方法了

getActivityStartController() 该方法返回对象为 

ActivityStartController

对应源码位置:frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java

执行该对象的 obtain() 方法后,会获取 ActivityStarter 对象

接着会执行 execute()  在该方法中会去调用executeRequest();

在executeRequest() 方法中,会去调用 startActivityUnchecked()

接着调用:startActivityInner() 对象

调用到这里会通过 RootWindowContainer.java 类调用 

resumeFocusedTasksTopActivities()方法,

该方法在Android 10的时候是有一个RootActivityContainer.java 在android 12版本看的话是已经移除了,并且将部分方法合入到了RootWindowContainer.java 中

源码位置:/frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java

从这里就可以看出

通过Task.java 调用到resumeTopActivityUncheckedLocked()

源码位置:/frameworks/base/services/core/java/com/android/server/wm/Task.java

到此处后,当前的调用到了 TopFragment.java 该类为 Task.java 的父类

调用到了ActivityTaskSupervisor.java 中的 startSpecificActivity 方法

从上图可以看出,realStartActivityLocked(),在該方法中會調用到

上图为android 12 中源码,下图为android 15源码,中间差异不影响主流程

通过源码可以看到  LaunchActivityItem.java 中会回调到 该类中的 execute()

贴上android 15 源码

走到此处可以看到该类会调用到 ActivityThread.java 中去

可以看出Activity 是 通过反射创建的对象,接着往下走可以看到

到此处,可以看到当前走到了 Activity 的onCreate() 中了。

最后还是要告诫自己,还是要多看多想多练

独自编写,如有错误,欢迎大家指出来

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值