- 《Android自定义View之Activity页面的组成》
- 《Android Activity——启动过程探索(一)》
- 《Android Activity——启动过程探索(二)》
- 《Android Activity——启动过程探索(三)》
- 《Activity 启动模式及任务栈探究》
- 《Activity常见问题》
Activity 生命周期:
首先来看一下当Activity启动时,会回调哪些生命周期的方法:
- 不关闭当前Activity启动流程:
- 关闭当前Activity启动流程:
对于上面的回调过程,我想大部分Android开发者都是知道的,但是对于系统是怎样一步一步来回调这些方法的,可能存在不少疑问。下面我们就通过源码来看看当我们调用 startActivity()
和 finish()
方法时系统是怎样一步步来回调各个方法的。
其实对于每一个生命周期方法的调用,都可以看做是一小步,所以我们的分析就可以比较简单的进行分步:
- 当前Activity调用 onPause()
- 新的Activity调用 onCreate()
- 新的Activity调用 onStart()
- 新的Activity调用 onResume()
- 当前Activity调用 onStop()
- 当前Activity调用 onDestory()【前提是调用了
finish()
方法】
在实际中,除了以上的生命周期方法回调外,还有一些回调方法也是比较重要的(比如:attach()、onRestart()等),就不在单独分析,而是在对应的地方一起分析了。
注意:以下分析过程,源码版本为 Android 10(Api 29),不同Android版本可能有一些差别。
当前Activity调用 onPause() 过程
根据上图查看对应的方法:
当我们调用 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)