文章目录

  • 前言
  • 一、ActivityManagerService.attachApplicationLocked
  • 二、ActivityStackSupervisor.attachApplicationLocked
  • 三、ActivityStackSupervisor.realStartActivityLocked

前言

在上一篇博客 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 ) 分析了从 ActivityThreadmain() 函数启动 , ApplicationThread 绑定 , Application 创建 , 下面继续分析后续内容 ;

一、ActivityManagerService.attachApplicationLocked


回到 AMS 中的 ActivityManagerService 方法 , 在调用 ActivityThread 绑定 ApplicationThread 后 ,

有调用了 mStackSupervisor.attachApplicationLocked 方法 , 查看顶部可见 Activity 是否正等待在此进程中运行 ;

public class ActivityManagerService extends IActivityManager.Stubimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {// 为 ActivityThread 绑定 ApplicationThread 主方法private final boolean attachApplicationLocked(IApplicationThread thread,int pid) {try {checkTime(startTime, "attachApplicationLocked: immediately before bindApplication");mStackSupervisor.mActivityMetricsLogger.notifyBindApplication(app);// 在此处为 ActivityThread 绑定 ApplicationThread , 此时又回到 ActivityThreadif (app.instr != null) {thread.bindApplication(processName, appInfo, providers,app.instr.mClass,profilerInfo, app.instr.mArguments,app.instr.mWatcher,app.instr.mUiAutomationConnection, testMode,mBinderTransactionTrackingEnabled, enableTrackAllocation,isRestrictedBackupMode || !normalMode, app.persistent,new Configuration(getGlobalConfiguration()), app.compat,getCommonServicesLocked(app.isolated),mCoreSettingsObserver.getCoreSettingsLocked(),buildSerial);} else {thread.bindApplication(processName, appInfo, providers, null, profilerInfo,null, null, null, testMode,mBinderTransactionTrackingEnabled, enableTrackAllocation,isRestrictedBackupMode || !normalMode, app.persistent,new Configuration(getGlobalConfiguration()), app.compat,getCommonServicesLocked(app.isolated),mCoreSettingsObserver.getCoreSettingsLocked(),buildSerial);}} catch (Exception e) {}// 查看顶部可见 Activity 是否正在等待在此进程中运行if (normalMode) {try {if (mStackSupervisor.attachApplicationLocked(app)) {didSomething = true;}} catch (Exception e) {Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);badApp = true;}}return true;}}

ActivityManagerService 完整源码参考 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

二、ActivityStackSupervisor.attachApplicationLocked


在上述 AMS 中的 attachApplicationLocked 方法中 , 调用了 ActivityStackSupervisorattachApplicationLocked 方法 ,

ActivityStackSupervisor.attachApplicationLocked 方法中 , 调用了 ActivityStackSupervisor.realStartActivityLocked 方法 ;

public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,RecentTasks.Callbacks {boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {// 省略其它代码 , 在此处调用了 realStartActivityLocked 方法 if (realStartActivityLocked(activity, app,top == activity /* andResume */, true /* checkConfig */)) {didSomething = true;}return didSomething;}
}

完整代码参考 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java ;

三、ActivityStackSupervisor.realStartActivityLocked


该方法步骤在 【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 二 ) 二、AMS 进程中执行的相关操作 章节进行过讲解 , 不管是冷启动 , 还是热启动 , 都要调用 ActivityStackSupervisor.realStartActivityLocked 方法开启 Activity ;

后续逻辑基本就与该博客后续的分析对应上了 ;

public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,RecentTasks.Callbacks {final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,boolean andResume, boolean checkConfig) throws RemoteException {if (!allPausedActivitiesComplete()) {// 当有活动暂停时,我们将跳过开始任何新活动,直到暂停完成。// 注意:对于在暂停状态下启动的活动,我们也会这样做,因为它们将首先恢复,然后在客户端暂停。if (DEBUG_SWITCH || DEBUG_PAUSE || DEBUG_STATES) Slog.v(TAG_PAUSE,"realStartActivityLocked: Skipping start of r=" + r+ " some activities pausing...");return false;}final TaskRecord task = r.getTask();final ActivityStack stack = task.getStack();beginDeferResume();try {r.startFreezingScreenLocked(app, 0);// 安排启动时间以收集有关慢速应用程序的信息。r.startLaunchTickingLocked();r.setProcess(app);if (getKeyguardController().isKeyguardLocked()) {r.notifyUnknownVisibilityLaunched();}// 让窗口管理器根据新的活动顺序重新评估屏幕方向。// 注意,这样做的结果是,它可以使用新的方向调用activity manager。// 我们不关心这一点,因为活动当前未运行,所以我们只是重新启动它。if (checkConfig) {// 推迟恢复,因为我们将很快启动新活动。// 我们不希望在确保配置和尝试恢复重点堆栈的顶级活动的同时,重复启动同一记录。ensureVisibilityAndConfig(r, r.getDisplayId(),false /* markFrozenIfConfigChanged */, true /* deferResume */);}if (r.getStack().checkKeyguardVisibility(r, true /* shouldBeVisible */,true /* isTop */)) {// 仅当基于keyguard状态允许活动可见时,我们才将可见性设置为true。// 这样可以避免在窗口管理器中将此设置为运动状态,// 而由于以后的调用而取消该设置,以确保将可见性设置回false的可见活动。r.setVisibility(true);}try {// 下面的代码是启动 Activity 的核心代码// Create activity launch transaction.final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,r.appToken);clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),System.identityHashCode(r), r.info,// TODO: Have this take the merged configuration instead of separate global// and override configs.mergedConfiguration.getGlobalConfiguration(),mergedConfiguration.getOverrideConfiguration(), r.compat,r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,r.persistentState, results, newIntents, mService.isNextTransitionForward(),profilerInfo));// 设置所需的最终状态。配置生命周期final ActivityLifecycleItem lifecycleItem;if (andResume) {// 开启新的 ActivitylifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());} else {// 终止 ActivitylifecycleItem = PauseActivityItem.obtain();}clientTransaction.setLifecycleStateRequest(lifecycleItem);// 安排事务。mService.getLifecycleManager().scheduleTransaction(clientTransaction);// 上面的代码是启动 Activity 的核心代码} catch (RemoteException e) {}} finally {endDeferResume();}return true;}
}

完整代码参考 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java ;

【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )相关推荐

  1. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 )

    文章目录 一.ActivityThread 主函数启动 二.ActivityThread 绑定 ApplicationThread 三.AMS attachApplication -> atta ...

  2. Activity启动过程——10.0源码分析

    对于一个activity,注意不是根activity,它的启动流程往往是通过创建intent,通过startActivity()的方式启动的,我们跟踪的就是安卓10.0这部分的启动流程. 在windo ...

  3. springboot启动过程_spring5/springboot2源码学习 -- spring boot 应用的启动过程

    推荐阅读: Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC 疫情期间"闭关修炼",吃透这本Java核心知识,跳槽面试不 ...

  4. Mybatis源码之核心流程分析

    终于谈到了Mybatis最核心的东西了,最核心的就是通过配置XML文件或注解中的SQL,直接调用接口就能执行配置好的SQL语句并封装成对应的返回类型的数据. 先看一下Mybatis使用示例: //创建 ...

  5. Android 源码 Wi-Fi 连接流程分析

    Wi-Fi 连接过程可以从 Settings App 中点击任意 Wi-Fi 条目连接说起.点击条目以后会弹出一个对话框,根据不同的 Wi-Fi 类型需要填入必要的信息,再点击连接按钮,发起连接过程. ...

  6. libevent源码学习-----事件驱动流程分析

    libevent中事件驱动的大体流程如下 /* 创建事件驱动 */ struct event_base* base = event_base_new(); /**创建一个事件*@param base: ...

  7. Android shortcut的使用及源码分析

    Android shortcut的使用及源码分析 最近遇到了一个切换国家码后部分应用的shortcut未更新的问题,就学习了shortcut的相关知识,在这里分享一下我了解的知识,希望能对大家有帮助. ...

  8. Android 10.0 Activity启动详解(二)

    Android 10.0 Activity启动详解(一) 我们在上一篇博客中已经介绍了关于Activity的一些基础概念.这一篇博客我们以Android 10.0的代码来分析Activity的启动流程 ...

  9. Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现

    写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...

最新文章

  1. 微服务发现与注册之Eureka源码分析
  2. java的编译及运行
  3. ajax核心代码提交,ajax表单在Asp.net核心提交后的RedirectToAction
  4. Service order save debug for distribution lock set logic
  5. 数据结构 - 多路搜索树(2-3树、b树、b+树、b*树)
  6. 最常见的10种Java异常问题!
  7. 环境变量的配置windows10系统
  8. knn的python代码_详细的的KNN代码——python实现
  9. python生成多个随机数列表_在python中生成1到6之间的6个随机数的列表
  10. java大数阶乘_Java大数阶乘
  11. 佳能Canon imageCLASS MF236n 一体机驱动
  12. 不积跬步无以至千里013
  13. LDAP简介及Java、客户端连接
  14. 肖申克的救赎-救赎自己的心灵
  15. 搭建ftp文件服务器
  16. EXCEL多列vlookup匹配
  17. 【开发工具】 Photoshop CS6 安装与破解
  18. android音视频播放器开发百度云,Android 播放端 SDK
  19. 美国征信巨头Equifax遭黑客入侵,1.43亿公民身份数据泄漏
  20. 环信im Flutter sdk使用帮助

热门文章

  1. 如何确定一个IAR工程所使用的IAR版本
  2. 网管日志-06.07.21
  3. Loading class `com.mysql.jdbc.Driver'. This is deprecated警告处理
  4. JavsScript中比较大小总结---基于sort()方法
  5. Visual studio中编译和使用libpng和zlib
  6. 2018.12.22 spoj7258 Lexicographical Substring Search(后缀自动机)
  7. C primer 第六章循环 习题6.7
  8. bzoj 2190: [SDOI2008]仪仗队 线性欧拉函数
  9. UVa 11107 (后缀数组 二分) Life Forms
  10. java 操作数据库