Android Activity——启动过程探索
Posted ITRenj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Activity——启动过程探索相关的知识,希望对你有一定的参考价值。
- 《Android自定义View之Activity页面的组成》
- 《Android Activity——启动过程探索(一)》
- 《Android Activity——启动过程探索(二)》
- 《Android Activity——启动过程探索(三)》
- 《Activity 启动模式及任务栈探究》
- 《Activity常见问题》
在《Android Activity——启动过程探索(一)》中我们知道了Activity启动的生命周期回调,并且分析了其中当前Activity的 onPause()
和新打开的Activity的 onCreate()
回调方法执行步骤,在这篇文章中接着分析新打开的Activity的 onStart()
和onResume()
回调执行过程。
注意:以下分析过程,源码版本为 android 10(Api 29),不同Android版本可能有一些差别。
新的Activity调用 onStart()
根据上图查看对应的方法:
当我们调用 startActivity() 之后,系统按如下步骤执行:
-> Activity#startActivity()
-> Activity#startActivityForResult()
-> Instrumentation#execStartActivity(activity, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options)
说明:
- mMainThread.getApplicationThread() 返回 ApplicationThread
- ApplicationThread 的声明为 ActivityThread.ApplicationThread extends IApplicationThread.Stub
-> ActivityTaskManagerService#startActivity()
说明:
- ActivityTaskManagerService 通过 ActivityTaskManager.getService() 获取
- ActivityTaskManager.getService() 返回 IActivityTaskManager
- ActivityTaskManagerService 的声明为 ActivityTaskManagerService extends IActivityTaskManager.Stub,所以上一步是:
ActivityTaskManagerService#startActivity()
-> ActivityTaskManagerService#startActivityAsUser()
说明:
- 会多次调用重载方法,这里就看做一步了,最终走到 下一步
-> ActivityStartController#obtainStarter()
说明:
- ActivityStartController 通过 getActivityStartController() 方法获取
- ActivityStartController.obtainStarter() 方法返回的是ActivityStarter对象
- 然后设置数据,实际调用的都是 ActivityStarter 中的设置数据方法,最终调用 ActivityStarter 的 execute() 方法
具体代码如下:
getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(bOptions)
.setMayWait(userId) // 注意该方法,会将ActivityStarter mRequest.mayWait = true;
.execute();
-> ActivityStarter#execute()
说明:
- 上一步的 setMayWait() 方法 会将 ActivityStarter 中的 mRequest.mayWait 标识置为 true,在 execute() 方法中会通过该标记判断下一步执行的方法
-> ActivityStarter#startActivityMayWait()
-> ActivityStarter#startActivity()
说明:
- 会多次调用重载 startActivity() 方法,这里就看做一步了,最终走到 下一步
-> ActivityStarter#startActivityUnchecked()
-> RootActivityContainer#resumeFocusedStacksTopActivities()
说明:
- 调用重载无参数方法,由无参数方法调用有参数方法,参数都为null,看做一步,走到下一步
-> ActivityStack#resumeTopActivityUncheckedLocked()
-> ActivityStack#resumeTopActivityInnerLocked()
-> ActivityStackSupervisor#startSpecificActivityLocked()
-> ActivityStackSupervisor#realStartActivityLocked()
realStartActivityLocked() 方法中有如下代码:
// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(
proc.getThread(), r.appToken);
final DisplayContent dc = r.getDisplay().mDisplayContent;
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
System.identityHashCode(r), r.info,
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),
r.icicle, r.persistentState, results, newIntents,
dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded(),r.assistToken));
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
说明:
- mService.getLifecycleManager() 方法返回的对象是 ClientLifecycleManager,(其中mService 是 ActivityTaskManagerService)
- 创建 ClientTransaction 对象后,调用了它的 addCallback() 方法,增加了 LaunchActivityItem 对象(LaunchActivityItem extends ClientTransactionItem)
-> ClientLifecycleManager#scheduleTransaction(ClientTransaction transaction)
-> ClientTransaction#schedule()
-> IApplicationThread#scheduleTransaction()
说明:
- IApplicationThread就是ActivityThread.ApplicationThread
- 在 ActivityThread.ApplicationThread 中直接调用了 ActivityThread.this.scheduleTransaction(transaction),所以最终调用的是 ActivityThread#scheduleTransaction(),但是 ActivityThread 中并没有这个方法,是在其父类 ClientTransactionHandler 中的方法( ActivityThread extends ClientTransactionHandler)
-> ClientTransactionHandler#sendMessage()
说明:
-
sendMessage() 方法在 ClientTransactionHandler中定义,由子类 ActivityThread 实现
-
在sendMessage()方法中传递的 what 是 ActivityThread.H.EXECUTE_TRANSACTION
-
在ActivityThread中的handler消息都是由 ActivityThread 内部类 H 负责处理,所以查看 H 类中 handleMessage() 方法对应的处理逻辑
case EXECUTE_TRANSACTION: final ClientTransaction transaction = (ClientTransaction) msg.obj; mTransactionExecutor.execute(transaction); if (isSystem()) transaction.recycle(); break;
-
mTransactionExecutor 对象是 TransactionExecutor
-> TransactionExecutor#execute(transaction)
==== 标记 =============================== 以上部分和上一步的是一样的 ==================================== 标记 ====
-> TransactionExecutor#executeCallbacks(transaction)
-> TransactionExecutor#cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState,ClientTransaction transaction)
说明:
-
直接是调用的4个参数的方法,且第三个参数传递的是 true
-
核心代码
final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);
performLifecycleSequence(r, path, transaction);
getLifecyclePath() 方法参数说明:
1. start:在上一步(调用新的Activity的onCreate()方法)中的performLaunchActivity()方法中ActivityClientRecord的状态已经变为了ON_CREATE(值为:1)
2. finish:在 ActivityStackSupervisor#realStartActivityLocked()方法中有如下代码:
if (andResume)
lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());
else
lifecycleItem = PauseActivityItem.obtain();
clientTransaction.setLifecycleStateRequest(lifecycleItem);
往前走能知道 andResume 参数为 true,所以这里的 lifecycleItem 为 ResumeActivityItem,参数 finish 通过 lifecycleItem.getTargetState() 获取(lifecycleItem 为 ResumeActivityItem)到的结果为 ON_RESUME (值为:3)
-
mHelper.getLifecyclePath() 实际是 TransactionExecutorHelper#getLifecyclePath(),代码如下:
public IntArray getLifecyclePath(int start, int finish, boolean excludeLastState) // ... mLifecycleSequence.clear(); if (finish >= start) // just go there for (int i = start + 1; i <= finish; i++) mLifecycleSequence.add(i); // ... // 这里的参数 excludeLastState 就是上面调用 cycleToPath() 方法的第三个参数,是true if (excludeLastState && mLifecycleSequence.size() != 0) mLifecycleSequence.remove(mLifecycleSequence.size() - 1); return mLifecycleSequence;
那么结果就是一个包含了元素 2 的数组。
-> TransactionExecutor#performLifecycleSequence(ActivityClientRecord r, IntArray path,ClientTransaction transaction)
说明:
private void performLifecycleSequence(ActivityClientRecord r, IntArray path,ClientTransaction transaction)
// path 数组的元素只包含了 2 也就是对应 ON_START 常量,所以这里只保留了相关代码
final int size = path.size();
for (int i = 0, state; i < size; i++)
state = path.get(i);
switch (state)
case ON_START:
mTransactionHandler.handleStartActivity(r, mPendingActions);
break;
-> ClientTransactionHandler#handleStartActivity()
说明:
- handleStartActivity() 方法在 ClientTransactionHandler中定义,由子类 ActivityThread 实现,所以查看 ActivityThread 的 handleStartActivity()
-> Activity#performStart()
-> Instrumentation#callActivityOnStart()
-> Activity#onStart()
通过以上过程,最终调用了新的Activity 的 onStart() 回调方法。接下来,继续查看新的Activity 的 onResume() 回调执行过程。
新的Activity调用 onResume()
根据上图查看对应的方法:
当我们调用 startActivity() 之后,系统按如下步骤执行:
-> Activity#startActivity()
-> Activity#startActivityForResult()
-> Instrumentation#execStartActivity(activity, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options)
说明:
- mMainThread.getApplicationThread() 返回 ApplicationThread
- ApplicationThread 的声明为 ActivityThread.ApplicationThread extends IApplicationThread.Stub
-> ActivityTaskManagerService#startActivity()
说明:
- ActivityTaskManagerService 通过 ActivityTaskManager.getService() 获取
- ActivityTaskManager.getService() 返回 IActivityTaskManager
- ActivityTaskManagerService 的声明为 ActivityTaskManagerService extends IActivityTaskManager.Stub,所以上一步是:
ActivityTaskManagerService#startActivity()
-> ActivityTaskManagerService#startActivityAsUser()
说明:
- 会多次调用重载方法,这里就看做一步了,最终走到 下一步
-> ActivityStartController#obtainStarter()
说明:
- ActivityStartController 通过 getActivityStartController() 方法获取
- ActivityStartController.obtainStarter() 方法返回的是ActivityStarter对象
- 然后设置数据,实际调用的都是 ActivityStarter 中的设置数据方法,最终调用 ActivityStarter 的 execute() 方法
具体代码如下:
getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(bOptions)
.setMayWait(userId) // 注意该方法,会将ActivityStarter mRequest.mayWait = true;
.execute();
-> ActivityStarter#execute()
说明:
- 上一步的 setMayWait() 方法 会将 ActivityStarter 中的 mRequest.mayWait 标识置为 true,在 execute() 方法中会通过该标记判断下一步执行的方法
-> ActivityStarter#startActivityMayWait()
-> ActivityStarter#startActivity()
说明:
- 会多次调用重载 startActivity() 方法,这里就看做一步了,最终走到 下一步
-> ActivityStarter#startActivityUnchecked()
-> RootActivityContainer#resumeFocusedStacksTopActivities()
说明:
- 调用重载无参数方法,由无参数方法调用有参数方法,参数都为null,看做一步,走到下一步
-> ActivityStack#resumeTopActivityUncheckedLocked()
-> ActivityStack#resumeTopActivityInnerLocked()
-> ActivityStackSupervisor#startSpecificActivityLocked()
-> ActivityStackSupervisor#realStartActivityLocked()
realStartActivityLocked() 方法中有如下代码:
// Create activity launch transaction.
final ClientTransaction clientTransaction = ClientTransaction.obtain(
proc.getThread(), r.appToken);
final DisplayContent dc = r.getDisplay().mDisplayContent;
clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
System.identityHashCode(r), r.info,
mergedConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfiguration(), r.compat,
r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),
r.icicle, r.persistentState, results, newIntents,
dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded(),r.assistToken));
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
说明:
- mService.getLifecycleManager() 方法返回的对象是 ClientLifecycleManager,(其中mService 是 ActivityTaskManagerService)
- 创建 ClientTransaction 对象后,调用了它的 addCallback() 方法,增加了 LaunchActivityItem 对象(LaunchActivityItem extends ClientTransactionItem)
-> ClientLifecycleManager#scheduleTransaction(ClientTransaction transaction)
-> ClientTransaction#schedule()
-> IApplicationThread#scheduleTransaction()
说明:
- IApplicationThread就是ActivityThread.ApplicationThread
- 在 ActivityThread.ApplicationThread 中直接调用了 ActivityThread.this.scheduleTransaction(transaction),所以最终调用的是 ActivityThread#scheduleTransaction(),但是 ActivityThread 中并没有这个方法,是在其父类 ClientTransactionHandler 中的方法( ActivityThread extends ClientTransactionHandler)
-> ClientTransactionHandler#sendMessage()
说明:
-
sendMessage() 方法在 ClientTransactionHandler中定义,由子类 ActivityThread 实现
-
在sendMessage()方法中传递的 what 是 ActivityThread.H.EXECUTE_TRANSACTION
-
在ActivityThread中的handler消息都是由 ActivityThread 内部类 H 负责处理,所以查看 H 类中 handleMessage() 方法对应的处理逻辑
case EXECUTE_TRANSACTION: final ClientTransaction transaction = (ClientTransaction) msg.obj; mTransactionExecutor.execute(transaction); if (isSystem()) transaction.recycle(); break;
-
mTransactionExecutor 对象是 TransactionExecutor
-> TransactionExecutor#execute(transaction)
-> TransactionExecutor#executeCallbacks(transaction)
==== 标记 =============================== 以上部分和上一步的是一样的 ==================================== 标记 ====
-> ActivityLifecycleItem#execute()
final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();
lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
说明:
-
transaction.getLifecycleStateRequest() 获取到的实际是:ResumeActivityItem。具体原因如下:
在 ActivityStackSupervisor#realStartActivityLocked()方法中有如下代码:
if (andResume) lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward()); else lifecycleItem = PauseActivityItem.obtain(); // 设置了 lifecycleItem clientTransaction.setLifecycleStateRequest(lifecycleItem);
往前走能知道 andResume 参数为 true,所以这里的 lifecycleItem 为 ResumeActivityItem
-> ClientTransactionHandler#handleResumeActivity()
说明:
- handleResumeActivity() 方法在 ClientTransactionHandler中定义,由子类 ActivityThread 实现,所以查看 ActivityThread 的 handleResumeActivity()
-> ActivityThread#performResumeActivity()
-> Activity#performResume()
-> Instrumentation#callActivityOnResume()
-> Activity#onResume()
其他说明:
在 Activity#performResume() 方法中,如果当前打开的Activity是有 stop -> start 状态的话,因为之前不会走创建那一块的逻辑了,所以调用流程如下:
-> Activity#performResume()
-> Activity#performRestart()
-> Instrumentation#callActivityOnRestart()
-> Activity#onRestart()
-> Activity#callActivityOnRestart()
-> Instrumentation#callActivityOnStart()
-> Activity#onStart()
-> Instrumentation#callActivityOnResume()
-> Activity#onResume()
通过以上过程,最终调用了新的Activity 的 onResume() 回调方法。到这一步,新的Activity已经完成了 创建->用户可见->用户可操作的过程,启动过程中的新的Activity回调执行完成。
以上是关于Android Activity——启动过程探索的主要内容,如果未能解决你的问题,请参考以下文章