我是靠谱客的博主 无辜身影,最近开发中收集的这篇文章主要介绍知识梳理系列之八——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启动流程总结-生命周期

最后

以上就是无辜身影为你收集整理的知识梳理系列之八——Activity的启动过程总结的全部内容,希望文章能够帮你解决知识梳理系列之八——Activity的启动过程总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部