知识梳理系列之八——Activity的启动过程

知识梳理系列之八——Activity的启动过程

总结

在应用内,某Activity A通过调用startActivity(Intent)方法启动Activity B的过程:

流程总结

  1. 调用startActivityForResult,使用Instrumentation调用execStartActivity,其中会传入Context、Intent、ActivityThread.mApplicationThread等引用;
  2. execStartActivity方法中通过Binder机制调用ActivityTaskManagerService的startActivity方法(在ActivityTaskManager中初始化了静态变量IActivityTaskManager,IActivityTaskManager即为ActivityTaskManagerService的远程代理);
  3. ActivityTaskManagerService.startActivity方法调用startActivityAsUser,传入userId等,经过重载的startActivityAsUser,使用getActivityStartController.obtaionStarter创建了ActivityStarter类的实例,并执行器execute方法;
  4. 进入ActivityStarter.execute,Request.mayWait为true(在上一步创建ActivityStarter实例时调用setMayWait设置的),执行startActivityMayWait方法;
  5. 经过多个startActivity重载方法的调用,触发startActivityUncheck,在方法中执行一个重要方法:RootActivityContainer.resumeFocusedStackTopActivityLocked;
  6. resumeFocusedStackTopActivityLocked这个方法主要做两件事,首先获取先前焦点Stack的ResumeActivity,并对其执行startPausingLocked方法;然后根据需要被启动的Activity所在进程是否启动,来决定是直接Resume还是触发ActivityStackSupervisor.startSpecificActivityLocked;
  7. 其中startPausingLocked方法会通过ATMS的LifecycleManager执行scheduleTransaction方法,进而执行PauseActivityItem.execute,执行ActivityThread的handlePauseActivity、performPauseActivity,并且在此执行被Pause的Activity的onSaveInstanceState onPause;
  8. startSpecificActivityLocked根据目标进程是否启动分别执行realStartActivityLocked方法或启动进程方法;
  9. realStartActivityLocked则会执行scheduleTransaction方法,此时执行的是LaunchActivityItem、ResumeActivityItem的preExecute、execute、postExecute方法;
  10. startPausingLockedrealStartActivityLock两个方法都是使用ClientTransaction来处理生命周期,都遵循
    ClientLifecycleManager.scheduleTransaction --> ClientTransaction.schedule --> ApplicationThread.scheduleTransaction --> ActivityThread.scheduleTransaction --> ClientTransactionHandler.scheduleTransaction --> 向ActivityThread.H发送消息:EXECUTE_TRANSACTION --> TransactionExecutor.execute --> ClientTransactionItem的preExe、cycleToPath、execute、postExe 的执行过程
    其中onPause的ClientTransactionItem是其子类PauseActivityItem;
    onCreate的ClientTransactionItem是其子类LaunchActivityItem;
    onResume的ClientTransactionItem是其子类ResumeActivityItem;

那么onStart啥时候执行的呢??
秘密藏在cycleToPath方法里,按照生命周期,起始状态是ON_CREATE,目标状态是ON_RESUME,过程中需要ON_START,这个在TransactionExecutor的performLifecycleSequence方法会按照需要调起生命周期的handle方法,触发他的正是cycleToPath,而起始、目标的设置是由ClientTransaction的addCallback、setLifecycleStateRequst来设置的!!!

  1. LaunchActivityItem的execute方法触发了handleLaunchActivity、performLaunchActivity,其中performLaunchActivity中做了创建ContextImpl、使用Instrumentation.newActivity创建Activity实例、调用Activity.attach(此方法中创建了PhoneWindow)、使用Instrumentation触发Activity的onCreate方法;
  2. ResumeActivityItem的execute方法触发了handleResumeActivity、performResumeActivity,最后触发activity的performResume和onResume;
  3. 此时,前一个Activity onSaveInstanceState、onPause了,新Activity onCreate、onStart、onResume了!!!

时序图

文字看起来比较费劲,那么看看时序图:
在这里插入图片描述
在来一张关于ActivityThread.H中的消息是怎么来的的图片:
这张图描述了诸如handlePause、handleLaunch、handleResume、performXXX的过程
消息来源和handle、perform方法的触发链

参考文章:
Activity启动流程总结-生命周期

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值