【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )
文章目录
- 前言
- 一、ActivityManagerService.attachApplicationLocked
- 二、ActivityStackSupervisor.attachApplicationLocked
- 三、ActivityStackSupervisor.realStartActivityLocked
前言
在上一篇博客 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 ) 分析了从 ActivityThread
的 main()
函数启动 , 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
方法中 , 调用了 ActivityStackSupervisor
的 attachApplicationLocked
方法 ,
在 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 流程分析 二 )相关推荐
- 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 一 )
文章目录 一.ActivityThread 主函数启动 二.ActivityThread 绑定 ApplicationThread 三.AMS attachApplication -> atta ...
- Activity启动过程——10.0源码分析
对于一个activity,注意不是根activity,它的启动流程往往是通过创建intent,通过startActivity()的方式启动的,我们跟踪的就是安卓10.0这部分的启动流程. 在windo ...
- springboot启动过程_spring5/springboot2源码学习 -- spring boot 应用的启动过程
推荐阅读: Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC 疫情期间"闭关修炼",吃透这本Java核心知识,跳槽面试不 ...
- Mybatis源码之核心流程分析
终于谈到了Mybatis最核心的东西了,最核心的就是通过配置XML文件或注解中的SQL,直接调用接口就能执行配置好的SQL语句并封装成对应的返回类型的数据. 先看一下Mybatis使用示例: //创建 ...
- Android 源码 Wi-Fi 连接流程分析
Wi-Fi 连接过程可以从 Settings App 中点击任意 Wi-Fi 条目连接说起.点击条目以后会弹出一个对话框,根据不同的 Wi-Fi 类型需要填入必要的信息,再点击连接按钮,发起连接过程. ...
- libevent源码学习-----事件驱动流程分析
libevent中事件驱动的大体流程如下 /* 创建事件驱动 */ struct event_base* base = event_base_new(); /**创建一个事件*@param base: ...
- Android shortcut的使用及源码分析
Android shortcut的使用及源码分析 最近遇到了一个切换国家码后部分应用的shortcut未更新的问题,就学习了shortcut的相关知识,在这里分享一下我了解的知识,希望能对大家有帮助. ...
- Android 10.0 Activity启动详解(二)
Android 10.0 Activity启动详解(一) 我们在上一篇博客中已经介绍了关于Activity的一些基础概念.这一篇博客我们以Android 10.0的代码来分析Activity的启动流程 ...
- Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现
写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...
最新文章
- 微服务发现与注册之Eureka源码分析
- java的编译及运行
- ajax核心代码提交,ajax表单在Asp.net核心提交后的RedirectToAction
- Service order save debug for distribution lock set logic
- 数据结构 - 多路搜索树(2-3树、b树、b+树、b*树)
- 最常见的10种Java异常问题!
- 环境变量的配置windows10系统
- knn的python代码_详细的的KNN代码——python实现
- python生成多个随机数列表_在python中生成1到6之间的6个随机数的列表
- java大数阶乘_Java大数阶乘
- 佳能Canon imageCLASS MF236n 一体机驱动
- 不积跬步无以至千里013
- LDAP简介及Java、客户端连接
- 肖申克的救赎-救赎自己的心灵
- 搭建ftp文件服务器
- EXCEL多列vlookup匹配
- 【开发工具】 Photoshop CS6 安装与破解
- android音视频播放器开发百度云,Android 播放端 SDK
- 美国征信巨头Equifax遭黑客入侵,1.43亿公民身份数据泄漏
- 环信im Flutter sdk使用帮助
热门文章
- 如何确定一个IAR工程所使用的IAR版本
- 网管日志-06.07.21
- Loading class `com.mysql.jdbc.Driver'. This is deprecated警告处理
- JavsScript中比较大小总结---基于sort()方法
- Visual studio中编译和使用libpng和zlib
- 2018.12.22 spoj7258 Lexicographical Substring Search(后缀自动机)
- C primer 第六章循环 习题6.7
- bzoj 2190: [SDOI2008]仪仗队 线性欧拉函数
- UVa 11107 (后缀数组 二分) Life Forms
- java 操作数据库