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

本文详细分析了Android 10中Activity启动过程,从调用startActivity()开始,逐步深入到onStart()和onResume()的执行流程。涉及ActivityTaskManagerService、ActivityStartController、TransactionExecutor等多个组件的交互,揭示了Activity生命周期背后的具体实现细节。

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

《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)

说明:

  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)
                .setMayWait(userId) // 注意该方法,会将ActivityStarter mRequest.mayWait = true;
                .execute();

-> ActivityStarter#execute()

说明:

  1. 上一步的 setMayWait() 方法 会将 ActivityStarter 中的 mRequest.mayWait 标识置为 true,在 execute() 方法中会通过该标记判断下一步执行的方法

-> ActivityStarter#startActivityMayWait()
-> ActivityStarter#startActivity()

说明:

  1. 会多次调用重载 startActivity() 方法,这里就看做一步了&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值