面对当前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() 中了。
最后还是要告诫自己,还是要多看多想多练
独自编写,如有错误,欢迎大家指出来