概述
Activity作为Android的四大组件之一,使用最为频繁.得益于最近比较清闲,特地看了一遍Activity的启动流程.现在总结于此.Activity的启动流程源码真是一大片又一大片.在次特地感谢YoungerHu的博客.本篇记录是从startActivity方法进行记录的
Activity整体时序图如下
具体方法调用整理
1. startActivity
startActivity()是Activity中的方法,还有另一个重载的方法.因为简单就不贴源码了.startActivity最后调用的都是startActivityForResult方法.
我们以最简单的 startActivity(new Intent(xxActivity.calss)) 为例,不涉及参数传递,只看最直接的启动过程
2. startActivityForResult
startActivityForResult也有很多重载方法,根据我们的例子实际调用的是
startActivityForResult(Intent intent, int requestCode,Bundle options),
1 | public void startActivityForResult(Intent intent, int requestCode, Bundle options) { |
解释
(a) mParent为什么为空点这里
3.execStartActivity
在Instrumentation中execStartActivity也有很多重载方法
实际调用的是execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,Intent intent, int requestCode, Bundle options);
1 | public ActivityResult execStartActivity( |
4.ActivityManagerService.startActivity,startActivityAsUser
ActivityManagerService中的startActivity方法并没有做什么,然后直接调用startActivityAsUser,在原有参数的基础上加了一个userId参数.
userId参数是跟多用户有关的,在我们的Activity启动流程中不用关心.
startActivityAsUser方法对userId进行了处理后就直接调用startActivityMayWait方法了.
5.startActivityMayWait
1 | final int startActivityMayWait(IApplicationThread caller, int callingUid, |
###
startActivityMayWait方法解析了目标activity并对一些状态进行了检验,然后调用startActivityLocked方法,继续启动Activity.让我们来看此方法.
6.startActivityLocked
1 | int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent, |
startActivityLocked方法很简单,并没有做太多处理,然后继续调用了ActivityStarter的startActivity方法
7.ActivityStarter.startActivity
1 | // 不要直接调用这个方法。使用{@link # startactivitylock}代替。 |
8.doPendingActivityLaunchesLocked
1 | /** |
9. ActivityStarter.startActivity
1 | private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord, |
10.startActivityUnchecked
1 | // 注意:此方法只能从{@link startActivity}调用 |
此方法中mTargetStack.startActivityLocked方法将Activity加入到了任务栈中,但此时Activity还没有显示出来.在继续调用resumeFocusedStackTopActivityLocked方法后,Activity才可见.
11.resumeFocusedStackTopActivityLocked
1 | boolean resumeFocusedStackTopActivityLocked() { |
12.resumeTopActivityUncheckedLocked
1 | boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) { |
13.resumeTopActivityInnerLocked
1 | private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) { |
此方法很复杂,代码行数超多.很难找到其中的关键代码. startSpecificActivityLocked方法在Android8.0源码的2633行. 继续来看此方法
14. startSpecificActivityLocked
1 | void startSpecificActivityLocked(ActivityRecord r, |
15.realStartActivityLocked
1 | final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, |
现在又回到了应用层离Activity显示已经不远了.ApplicationThread是ActivityThread的内部类,在ActivityThread的685行.我们继续来看scheduleLaunchActivity
16.scheduleLaunchActivity
1 |
|
17. Handler
1 | private class H extends Handler { |
18.performLaunchActivity
1 | private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { |
在执行了以上主要的调用后,Activity就显示到屏幕上,至于具体的创建Context,Application等方法就不在此记录了,有兴趣的可以自己去看看.