首页 > 其他分享 >Android10和Android12的Activity启动流程整理

Android10和Android12的Activity启动流程整理

时间:2023-01-25 20:55:55浏览次数:55  
标签:Android10 Android12 scheduleTransaction ActivityStarter ActivityThread Transacti

Android10和Android12的Activity启动流程整理

回顾一下Android10的Activity的启动流程:

  • Activity # startActivity
  • Activity # startActivityForResult
  • Instrumentation # execStartActivity // 在Android10之前,是交给AMS进行处理,随后交给ATMS处理,而Android10之后,直接交给ATMS进行处理
  • ActivityTaskManagerService # startActivity
  • ActivityTaskManagerService # startActivityAsUser
  • ActivityStarter # execute
  • ActivityStarter # startActivityMayWait
  • ActivityStarter # startActivity
  • ActivityStarter # startActivityUnchecked
  • ActivityStack # startActivityLocked
  • ActivityStack # ensureActivitiesVisibleLocked
  • ActivityRecord # makeClientVisible
  • ActivityRecord # makeActiveIfNeeded
  • ActivityStack # resumeTopActivityUncheckedLocked
  • ActivityStack # resumeTopActivityInnerLocked
  • ActivityStackSupervisor # startSpecificActivityLocked
  • ActivityStackSupervisor # realStartActivityLocked
  • ClientLifecycleManager # scheduleTransaction 在这里会去获取ActivityTaskManagerService的LifecycleManager对象,去执行事务
  • ClientTransaction # schedule()
  • IApplicationThread(ApplicationThread为该aidl接口的实现类) # scheduleTransaction
  • ActivityThread(ClientTransactionHandler为ActivityThread的父类,交由其父类处理) # scheduleTransaction
  • ClientTransactionHandler # scheduleTransaction 该方法会发送一个Message ActivityThread.H.EXECUTE_TRANSACTION
  • ActivityThread # handleMessage 接着交由TransactionExecutor进行处理
  • TransactionExecutor # execute() 交由TransactionExecutor处理事务
  • TransactionExecutor # executeCallbacks 向注册的监听回调对应的状态
  • ClientTransactionItem # execute 在这里是LaunchActivityItem的类型,因为在ActivityStackSupervisor进行封装Transaction的时候,封装的是LaunchActivityItem类型的事务对象,所以这里从事务对象中获取时,也是执行LaunchActivityItem的execute方法
  • ClientTransactionHandler(ActivityThread) # handleLaunchActivity
  • ActivityThread # performLaunchActivity 这里就是启动Activity的核心位置
  • Instrumentation # callActivityOnCreate
  • Activity # performCreate
  • Activity # onCreate

Android10的启动Activity的代码就到这里,接着就会回调到开始启动Activity的onCreate()方法

Android12 Activity启动流程

  • Activity # startActivity
  • Activity # startActivityForResult
  • Instrumentation # execStartActivity
  • ActivityTaskManagerService # startActivity
  • ActivityTaskManagerService # startActivityAsUser
  • ActivityStarter # execute
  • ActivityStarter # executeRequest
  • ActivityStarter # startActivityUnchecked 在这里进行一些检查
  • ActivityStarter # startActivityInner 在startActivityInner()的时候,基本上已经检查完毕了,会先去进行状态的初始化,也就是从AcitivityRecord当中将对应的参数存储到本地使用等。
  • Task # startActivityLocked 在这里开始,启动Activity的任务就交给了Task处理,不再交给ActivityStack进行处理了
  • Task # ensureActivitiesVisible
  • Task # forAllLeafTasks(task -> task.mEnsureActivitiesVisibleHelper.process) 在Android12上,采用的大量的Consumer的方式进行事件的处理
  • EnsureActivitiesVisibleHelper # process
  • EnsureActivitiesVisibleHelper # setActivityVisibilityState
  • ActivityRecord # makeActiveIfNeeded
  • Task # resumeTopActivityUncheckedLocked 通过ActivityRecord getRootTask来进行后续处理
  • Task # resumeTopActivityInnerLocked
  • ActivityTaskSupervisor # startSpecificActivity
  • ActivityTaskSupervisor # realStartActivityLocked 在这里会进行Transaction的封装,封装了LaunchActivityItem类型的Transaction
  • ClientLifecycleManager # scheduleTransaction
  • ClientTransaction # schedule()
  • IApplicationThread(ApplicationThread为该aidl接口的实现类) # scheduleTransaction
  • ActivityThread(ClientTransactionHandler为ActivityThread的父类,交由其父类处理) # scheduleTransaction
  • ClientTransactionHandler # scheduleTransaction 该方法会发送一个Message ActivityThread.H.EXECUTE_TRANSACTION
  • ActivityThread # handleMessage 接着交由TransactionExecutor进行处理
  • TransactionExecutor # execute() 交由TransactionExecutor处理事务
  • TransactionExecutor # executeCallbacks 向注册的监听回调对应的状态
  • LaunchActivityItem # execute
  • ClientTransactionHandler(ActivityThread) # handleLaunchActivity
  • ActivityThread # performLaunchActivity
  • Instrumentation # callActivityOnCreate
  • Activity # performCreate
  • Activity # onCreate

暂时通过方法名进行记录,抽空补充流程图。
简单小结一下:
这里是对startActivity的流程进行了简单数理,其实大体上的差异变化没有太大,唯一有变化的就是在Android10上,很多事务Transaction的封装都是通过ActivityStack 和ActivityStackSupervisior来进行处理的。而Android12 是交给了Task和ActivityTaskSupervisor来进行处理,并且移除了ActivityStack和ActivityStackSupervisor这两个类。

参考链接:
https://www.jianshu.com/p/73b748535675
http://aospxref.com/android-12.0.0_r3
https://aospxref.com/android-10.0.0_r47

标签:Android10,Android12,scheduleTransaction,ActivityStarter,ActivityThread,Transacti
From: https://www.cnblogs.com/zhenji-li/p/17067274.html

相关文章

  • [SolidJS] Build a simple version of reactivity
    letcontext=[]functioncleanup(observer){for(constdepofobserver.dependencies){dep.delete(observer)}}functionsubscribe(observer,subscr......
  • 调用fragment中的onActivityResult时发生java.lang.IndexOutOfBoundsException问题,请
    调用fragment中的onActivityResult时概率发生java.lang.IndexOutOfBoundsException问题,请问下什么原因?StartScanCodeFragment中代码:overridefunonActivityResult(reques......
  • Android开发学习之路--Activity之Intent
      窗外再次飘起了小雪,还有1周就过年了,2016年即将到来,来年不知道自己将身处何处,船到桥头自然直吧。还是继续学习吧,上次学习了Activity,那么如果是两个Activity之间,怎么从......
  • Android开发学习之路--Activity之初体验
      环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看an......
  • Android:如何在后台启动Activity
     通常我用这段代码开始一个活动:Intenti=newIntent(context,MyActivity.class);i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(i);......
  • Android之Activity的启动模式
    在Android中,Activity的启动模式有5种,我们大多数开发中,很少根据具体的场景去设定Activity的启动模式,其实理解了启动模式,可以在解决某些场景问题的时候,让我们更简单的去解决......
  • [完全免费] 在线UML Activity Diagram 活动图工具 - 教程第5部分
    活动图与业务工作流程图类似,或者简单地说是具有更丰富语义的流程图。它描述了系统活动或进行活动的人员以及这些活动的顺序流程。活动图是与面向对象方法相关的UML图之一,因......
  • Activity 类似Dialog主题背景高斯模糊
     可以参考此文章:Android中Activity和AppcompatActivity的区别(详细解析)_today_work的博客-CSDN博客/***今天接到的需求是Activty主题是Dialog样式,背景需要是桌面当......
  • Activity的生命周期简述
    一、Activity的生命周期简述在讲onStart()和onResume()的区别之前,必须清楚Activity的四种状态:1.Running状态:一个新的Activity的启动入栈后,它在屏幕最前端,处于栈的最顶端,......
  • activity不适配达梦
    最近在做项目国产化,由mysql迁移到达梦数据库,在中间过程出现一些问题,由此记录下来。在迁移过程中,启动项目,发现报错:一查发现是activity不支持达梦。百度了一下,发现要修改源......