注:源码分析基于 Android SDK API 28
对于 Activity 大家都已经很熟悉很亲切了吧,在这就不过多介绍了。
直接进入正题,走起!
一般我们启动 Activity 的入口都是 startActivity ,所以这也成为了我们分析整个流程的切入口。
Activity
startActivity(Intent intent)
1 | @Override |
其实最后都是调用 startActivityForResult 这个方法。
startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options)
1 | public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, |
在 mParent 为空的情况下,直接调用 mInstrumentation.execStartActivity 来启动 Activity 。
这里的 mParent 其实是指 ActivityGroup ,用来嵌套多个 Activity ,是早已废弃的 API 了。
所以一般情况下,mParent 都是为空的。那我们跟进到 Instrumentation 中的 execStartActivity 方法去看。
Instrumentation
execStartActivity
1 | public ActivityResult execStartActivity( |
在上面的代码中,调用了 ActivityManager.getService() 。其实实质上就是获取了 ActivityManagerService 。之后就会在 AMS 中去执行 Activity 的启动流程。
另外,返回的结果 result 会在 checkStartActivityResult 中去检查。比如 Activity 没有在 AndroidManifest.xml 中注册,就会抛出异常。
那我们来看看 AMS 中的实现。
ActivityManager
getService()
1 | public static IActivityManager getService() { |
可以看到 ActivityManager.getService() 获取的就是 AMS 对象。那么接着来看 AMS 的 startActivity 方法。
ActivityManagerService
startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions)
1 | @Override |
直接调用的是 startActivityAsUser 方法。
startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser)
1 | public final int startActivityAsUser(IApplicationThread caller, String callingPackage, |
这里的 mActivityStartController.obtainStarter 就是创建了一个 ActivityStarter 对象。
ActivityStarter 是什么东西呢?
This class collects all the logic for determining how an intent and flags should be turned into an activity and associated task and stack.
官方的解释是把 activity 启动过程中处理 intent 和 flags 的逻辑以及任务栈等操作都被封装在 ActivityStarter 中了。
而 startActivityAsUser 干的事就是把参数传进去,用 builder 模式构造出一个 ActivityStarter 对象。然后调用他的 execute 方法去执行。
所以我们直接来看 execute 方法。
ActivityStarter
execute()
1 | int execute() { |
在上一步构造 ActivityStarter 的过程中,有一句 setMayWait(userId) 代码。这句代码内部会将 mayWait 设置为 true 。所以我们要深入到 startActivityMayWait 方法中去。
startActivityMayWait(IApplicationThread caller, int callingUid, String callingPackage, Intent intent, String resolvedType, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, WaitResult outResult, Configuration globalConfig, SafeActivityOptions options, boolean ignoreTargetSecurity, int userId, TaskRecord inTask, String reason, boolean allowPendingRemoteAnimationRegistryLookup)
1 | private int startActivityMayWait(IApplicationThread caller, int callingUid, |
在这个方法中,获取 Activity 的 intent 信息,解析得到 ResolveInfo 和 ActivityInfo ,另外获取 callingPid 和 callingUid 。
这个方法的代码很多,看得头疼。但是我们就关心其中的关键代码:
final ActivityRecord[] outRecord = new ActivityRecord[1];
int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo,
voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid,
callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options,
ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason,
allowPendingRemoteAnimationRegistryLookup);
startActivityMayWait 内部调用 startActivity 来启动 Activity 。所以我们还是要追踪到 startActivity 方法中。
startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent, String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, String callingPackage, int realCallingPid, int realCallingUid, int startFlags, SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, TaskRecord inTask, String reason, boolean allowPendingRemoteAnimationRegistryLookup)
1 | private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent, |
内部又调用了另一个 startActivity 的重载方法。
startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent, String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, String callingPackage, int realCallingPid, int realCallingUid, int startFlags, SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup)
1 | private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent, |
在这个方法中,主要创建一个 ActivityRecord 。重点关注最后一句代码:
return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask, outActivity);
所以又又又跳转到另外一个 startActivity 的重载方法中了。。
startActivity(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask, ActivityRecord[] outActivity)
1 | private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord, |
在方法内部,把操作交给了 startActivityUnchecked 方法。
startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask, ActivityRecord[] outActivity)
1 | private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, |
在 startActivityUnchecked 中,给 Activity 设置了 TaskRecord , 完成后执行ActivityStackSupervisor.resumeFocusedStackTopActivityLocked 方法。
ActivityStackSupervisor
resumeFocusedStackTopActivityLocked(ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions)
1 | boolean resumeFocusedStackTopActivityLocked( |
在 resumeFocusedStackTopActivityLocked 中,跳转到 ActivityStack 的 resumeTopActivityUncheckedLocked 方法中去执行了。
ActivityStack
resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options)
1 | @GuardedBy("mService") |
可以看到代码中的 result 是 resumeTopActivityInnerLocked 方法的返回值。所以还要跳到 resumeTopActivityInnerLocked 方法中去看。
resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options)
1 | @GuardedBy("mService") |
方法中的代码很长,可以看到最后都是调用了 mStackSupervisor.startSpecificActivityLocked
所以还是要到 ActivityStackSupervisor 的 startSpecificActivityLocked 方法中去看。
ActivityStackSupervisor
startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig)
1 | void startSpecificActivityLocked(ActivityRecord r, |
在 startSpecificActivityLocked 中会判断进程是否存在,因为我们分析的是 startActivity 的逻辑,所以肯定是已经存在了进程的,所以会调用 realStartActivityLocked()方法。
realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig)
1 | final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, |
上面又是一段贼长的代码,看的费劲。我们就直接来关注重点:
// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
r.appToken);
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
System.identityHashCode(r), r.info,
// TODO: Have this take the merged configuration instead of separate global
// and override configs.
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, results, newIntents, mService.isNextTransitionForward(),
profilerInfo));
// Set desired final state.
final ActivityLifecycleItem lifecycleItem;
if (andResume) {
lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
} else {
lifecycleItem = PauseActivityItem.obtain();
}
clientTransaction.setLifecycleStateRequest(lifecycleItem);
// Schedule transaction.
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
- 首先创建了一个 ClientTransaction ,那什么是 ClientTransaction 呢?ClientTransaction 可以理解为内部包含了一系列的 Activity 生命周期状态的事务,这些事务会最终交给 ActiivtyThread 来处理,然后 ActiivtyThread 再回调相应的 Activity 生命周期。
- ClientTransaction 添加了 LaunchActivityItem ,LaunchActivityItem 简单的说就是用来启动 Activity 的。
- 设置了最终的生命周期状态,这里是添加了 ResumeActivityItem 。即 Activity 最终生命周期的状态是 resumed 。
- 调用 LifecycleManager 来启动 clientTransaction 。mService.getLifecycleManager() 其实是一个 ClientLifecycleManager 对象。
那么就来看看 ClientLifecycleManager.scheduleTransaction 方法
ClientLifecycleManager
scheduleTransaction(ClientTransaction transaction)
1 | void scheduleTransaction(ClientTransaction transaction) throws RemoteException { |
transaction.getClient() 方法主要获取了需要启动 Activity 进程的代理对象 IApplicationThread
然后内部直接调用了 ClientTransaction 的 schedule 方法。
ClientTransaction
schedule()
1 | public void schedule() throws RemoteException { |
schedule 又调用了 mClient.scheduleTransaction 。mClient 就是与 ActivityThread 通讯的代理对象 IApplicationThread ,所以这里其实是调用 ActivityThread 类中 ApplicationThread 内部类
ApplicationThread
scheduleTransaction(ClientTransaction transaction)
1 | @Override |
直接调用的是 ActivityThread 的 scheduleTransaction 方法。
有些同学可能会纳闷,ActivityThread 里面没有找到 scheduleTransaction 这个方法啊?别着急,我们来看 ActivityThread 是继承 ClientTransactionHandler 的。所以 scheduleTransaction 这个方法在 ClientTransactionHandler 里面。
ClientTransactionHandler
scheduleTransaction(ClientTransaction transaction)
1 | void scheduleTransaction(ClientTransaction transaction) { |
调用了 ActivityThread 的 sendMessage() 方法。
ActivityThread
handleMessage(Message msg)
1 | void sendMessage(int what, Object obj) { |
sendMessage 方法其实就是将 ClientTransaction 参数通过 Handler 机制切换至主线程进行处理。这里的 Handler 就是 H 。相应的,sendMessage 之后,我们就要追踪到 H 的 handleMessage 方法中看了。
H
handleMessage(Message msg)
1 | public void handleMessage(Message msg) { |
handleMessage 的代码有点长,我们只关注 EXECUTE_TRANSACTION 部分。
发现利用了 mTransactionExecutor 来处理 transaction 。mTransactionExecutor 其实是 TransactionExecutor 的一个对象,所以要到 TransactionExecutor 中去追踪。
TransactionExecutor
execute(ClientTransaction transaction)
1 | public void execute(ClientTransaction transaction) { |
这里主要看这两行代码:
- executeCallbacks(transaction) 在这里面会去执行 LaunchActivityItem 。也就是会去创建 Activity 并回调 onCreate 生命周期方法;
- executeLifecycleState(transaction) 在这里会执行 ResumeActivityItem 。之前创建出来的 Activity 的也会回调 onStart 、onResume 生命周期方法。
那我们慢慢看吧,先来看 executeCallbacks(transaction)
executeCallbacks(ClientTransaction transaction)
1 | @VisibleForTesting |
上面代码主要干的事情就是先获取 ClientTransaction 中的 ClientTransactionItem 对象。然后调用 ClientTransactionItem.execute 。
别看上面代码一大串的,其实最重要的就是 item.execute(mTransactionHandler, token, mPendingActions);
这句代码了。
说明了 TransactionExecutor 内部是交给每个 item 来处理对应的操作的。而上面分析可以知道,这个 item 就是 LaunchActivityItem 。
LaunchActivityItem
execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions)
1 | @Override |
在 LaunchActivityItem 的 execute 内部,调用了 client.handleLaunchActivity 来执行。而 client 就是 ActivityThread 。所以我们要继续追踪到 ActivityThread.handleLaunchActivity 。
ActivityThread
handleLaunchActivity(ActivityClientRecord r, PendingTransactionActions pendingActions, Intent customIntent)
1 | @Override |
看来一句关键的代码
final Activity a = performLaunchActivity(r, customIntent);
最终可以看到,Activity 就是 performLaunchActivity 方法创建出来的。
performLaunchActivity(ActivityClientRecord r, Intent customIntent)
1 | /** Core implementation of activity launch. */ |
我们把上面这段代码整理一下(以下总结来自《Android开发艺术探索》):
- 从 ActivityClientRecord 中获取待启动的 Activity 的组件信息;
- 通过 Instrumentation 的 newActivity 方法使用类加载器创建 Activity 对象;
- 通过 LoadedApk 的 makeApplication 方法来尝试创建 Application 对象;
- 创建 ContextImpl 对象并通过 Activity 的 attach 方法来完成一些重要数据的初始化;
- 调用 Activity 的 onCreate 方法
在这里,1-4点详细的分析就不展开了,我们重点来看一下第5小点。
即
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
Instrumentation
callActivityOnCreate
1 | public void callActivityOnCreate(Activity activity, Bundle icicle) { |
到这,有一种豁然开朗的感觉。原来 Activity 的生命周期调用都是通过 Instrumentation 调用来完成的。
Activity
performCreate(Bundle icicle)
1 | final void performCreate(Bundle icicle) { |
源码分析到这里,基本上把 Activity 创建和回调 onCreate 生命周期讲完了。
前面还留了一个坑,就是 Activity 是怎么回调 onStart 和 onResume 的呢?我们只能到下一篇再讲了。
bye bye