- 《Android自定义View之Activity页面的组成》
- 《Android Activity——启动过程探索(一)》
- 《Android Activity——启动过程探索(二)》
- 《Android Activity——启动过程探索(三)》
- 《Activity 启动模式及任务栈探究》
- 《Activity常见问题》
在《Android Activity——启动过程探索(一) 和 《Android Activity——启动过程探索(二) 中我们知道了Activity启动的生命周期回调,并且分析了其中当前Activity的 onPause()
和新打开的Activity的 onCreate()
、 onStart()
和onResume()
回调执行过程,也就是新的Activity已经完成了 “创建->用户可见->用户可操作” 的过程。那么当前的Activity就变为不可见了,需要执行 onstop()
回调,如果调用了 finish()
方法,还要执行 onDestory()
回调,这篇文章我们就来分析一下这两个回调的执行过程。
注意:以下分析过程,源码版本为 Android 10(Api 29),不同Android版本可能有一些差别。
当前Activity调用 onStop()
根据上图查看对应的方法:
当我们调用 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()