Android Activity——启动过程探索(一)

本文详细探讨了Android Activity的启动过程,从调用`startActivity()`开始,逐步解析了`onPause()`、`onCreate()`等生命周期回调的源码执行路径。分析涉及ActivityTaskManagerService、ActivityStartController、TransactionExecutor等多个关键组件,揭示了系统如何通过一系列内部方法调用来启动和切换Activity。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity 生命周期:
activity_lifecycle

首先来看一下当Activity启动时,会回调哪些生命周期的方法:

  • 不关闭当前Activity启动流程:

不关闭当前Activity启动流程

  • 关闭当前Activity启动流程:

关闭当前Activity启动流程
对于上面的回调过程,我想大部分Android开发者都是知道的,但是对于系统是怎样一步一步来回调这些方法的,可能存在不少疑问。下面我们就通过源码来看看当我们调用 startActivity()finish() 方法时系统是怎样一步步来回调各个方法的。

其实对于每一个生命周期方法的调用,都可以看做是一小步,所以我们的分析就可以比较简单的进行分步:

  1. 当前Activity调用 onPause()
  2. 新的Activity调用 onCreate()
  3. 新的Activity调用 onStart()
  4. 新的Activity调用 onResume()
  5. 当前Activity调用 onStop()
  6. 当前Activity调用 onDestory()【前提是调用了 finish() 方法】

在实际中,除了以上的生命周期方法回调外,还有一些回调方法也是比较重要的(比如:attach()、onRestart()等),就不在单独分析,而是在对应的地方一起分析了。

注意:以下分析过程,源码版本为 Android 10(Api 29),不同Android版本可能有一些差别。

当前Activity调用 onPause() 过程

Activity 启动流程-1. 当前Activity流程 onPause()

根据上图查看对应的方法:

当我们调用 startActivity() 之后,系统按如下步骤执行:

-> Activity#startActivity()
-> Activity#startActivityForResult()
-> Instrumentation#execStartActivity(activity, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options)

说明:

  1. mMainThread.getApplicationThread() 返回 ApplicationThread
  2. ApplicationThread 的声明为 ActivityThread.ApplicationThread extends IApplicationThread.Stub

-> ActivityTaskManagerService#startActivity()

说明:

  1. ActivityTaskManagerService 通过 ActivityTaskManager.getService() 获取
  2. ActivityTaskManager.getService() 返回 IActivityTaskManager
  3. ActivityTaskManagerService 的声明为 ActivityTaskManagerService extends IActivityTaskManager.Stub,所以上一步是: ActivityTaskManagerService#startActivity()

-> ActivityTaskManagerService#startActivityAsUser()

说明:

  1. 会多次调用重载方法,这里就看做一步了,最终走到 下一步

-> ActivityStartController#obtainStarter()

说明:

  1. ActivityStartController 通过 getActivityStartController() 方法获取
  2. ActivityStartController.obtainStarter() 方法返回的是ActivityStarter对象
  3. 然后设置数据,实际调用的都是 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)
             
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值