基于Android13源码分析Launcher启动

        AMS被SystemServer启动之后,SystemServer会通过AMS调用startHomeActivity启动Launcher. Launcher其实就是个Activity,学习Launcher的启动后,再去看Activity启动,会容易很多。

Launcher的启动分2个阶段:

第一阶段是startHomeActivity,触发activity的进程创建;

第二阶段就是AMS的attachApplication在进程创建后被调用,最终执行realStartActivityLocked会回调Activity的onCreate函数。

class ActivityManagerService{public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {...mAtmInternal.resumeTopActivities(false /* scheduleIdle */);...}    
}class ActivityTaskManagerService{@Overridepublic void resumeTopActivities(boolean scheduleIdle) {synchronized (mGlobalLock) {mRootWindowContainer.resumeFocusedTasksTopActivities();if (scheduleIdle) {mTaskSupervisor.scheduleIdle();}}}
}class RootWindowContainer{boolean resumeFocusedTasksTopActivities(Task targetRootTask, ActivityRecord target, ActivityOptions targetOptions,boolean deferPause) {for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {...result |= resumedOnDisplay[0];if (!resumedOnDisplay[0]) {if (focusedRoot != null) {result |= focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);} else if (targetRootTask == null) {result |= resumeHomeActivity(null /* prev */, "no-focusable-task",display.getDefaultTaskDisplayArea());}}}}boolean startHomeOnTaskDisplayArea(int userId, String reason, TaskDisplayArea taskDisplayArea, boolean allowInstrumenting, boolean fromHomeKey) {Intent homeIntent = null;ActivityInfo aInfo = null;if (taskDisplayArea == getDefaultTaskDisplayArea()) {homeIntent = mService.getHomeIntent();aInfo = resolveHomeActivity(userId, homeIntent);} else if (shouldPlaceSecondaryHomeOnDisplayArea(taskDisplayArea)) {Pair<ActivityInfo, Intent> info = resolveSecondaryHomeActivity(userId, taskDisplayArea);aInfo = info.first;homeIntent = info.second;}if (aInfo == null || homeIntent == null) {return false;}if (!canStartHomeOnDisplayArea(aInfo, taskDisplayArea, allowInstrumenting)) {return false;}// Updates the home component of the intent.homeIntent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));homeIntent.setFlags(homeIntent.getFlags() | FLAG_ACTIVITY_NEW_TASK);// Updates the extra information of the intent.if (fromHomeKey) {homeIntent.putExtra(WindowManagerPolicy.EXTRA_FROM_HOME_KEY, true);if (mWindowManager.getRecentsAnimationController() != null) {mWindowManager.getRecentsAnimationController().cancelAnimationForHomeStart();}}homeIntent.putExtra(WindowManagerPolicy.EXTRA_START_REASON, reason);// Update the reason for ANR debugging to verify if the user activity is the one that// actually launched.final String myReason = reason + ":" + userId + ":" + UserHandle.getUserId(aInfo.applicationInfo.uid) + ":" + taskDisplayArea.getDisplayId();mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea);return true;}
}

在线源码:

1 Launcher

2 ActivityManagerService

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习-理论学习

系统学习机器学习理论知识需要你从基础的数学和统计原理开始&#xff0c;逐步深入了解各类算法和模型&#xff0c;最后掌握高级技术和应用领域。以下是机器学习全面的理论知识指南&#xff0c;内容较长&#xff0c;以满足你对知识深度的需求。 1. 数学和统计基础 机器学习的许…

螺旋式开发是不是就是敏捷开发?

螺旋式开发并不是敏捷开发。虽然它们都是软件开发过程中的一种模型或方法&#xff0c;但两者在核心理念、实施方式和适用场景上存在显著差异。 螺旋式开发是一种结合了瀑布式开发和迭代式开发的软件开发过程。它强调风险分析和质量保证&#xff0c;在每个螺旋周期中都包括需求…

大语言模型(LLM)入门级选手初学教程 II

模型架构 5.1 输入编码&#xff1a; i. 词元序列编码 Input Embedding Module ii. 位置编码&#xff08;Position Embedding, PE)&#xff0c;Transformer 的编码器结构本身无法识别序列中元素的顺序。 &#x1d499;&#x1d461; &#x1d497;&#x1d461; &#x1d491…

【深度学习】实验 — 动手实现 GPT【二】:注意力机制、注意力掩码、多头注意力机制

【深度学习】实验 — 动手实现 GPT【二】&#xff1a;注意力机制、多头注意力机制 注意力机制简单示例&#xff1a;单个元素的情况简单示例&#xff1a;计算所有输入词元的注意力权重推广到所有输入序列词元&#xff1a; 注意力掩码代码实现多头注意力测试 注意力机制 简单示例…

数据库(31)——事务

事务 数据库事务&#xff08;Database Transaction&#xff09;是数据库管理系统&#xff08;DBMS&#xff09;中执行的一组逻辑操作单元&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部不执行&#xff0c;以保持数据的一致性和完整性。事务是确保数据可靠性的重要机…

Android 获取OAID

获取OAID 老规矩&#xff0c;直接上&#xff1a; implementation com.huawei.hms:opendevice:6.11.0.300 // 要获取华为vaid 和aaid&#xff0c;还需添加opendevice 依赖implementation(name: oaid_sdk_2.5.0, ext: aar) import android.content.Context; import android.util.…

每日互动基于 Apache DolphinScheduler 从容应对ClickHouse 大数据入库瓶颈

引言 大家好&#xff0c;我叫张琦&#xff0c;来自每日互动&#xff0c;担任大数据平台架构师。今天我将分享我们团队在基于Apache DolphinScheduler实现ClickHouse零压入库过程中的实践经验。 这个实践项目涉及到两个关键组件&#xff1a;Apache DolphinScheduler和ClickHous…

[vulnhub] Brainpan1

https://www.vulnhub.com/entry/brainpan-1,51/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是166 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-1…

JAVA的设计模式都有那些

Java设计模式是为了解决软件开发中常见的问题而创建的一系列最佳实践。它们提供了一种在特定情境下解决问题的方法论&#xff0c;并且已经被广泛验证和应用。这些模式不是具体的代码&#xff0c;而是关于如何组织代码以达到某种目的的高层次描述。设计模式通常分为三大类&#…

一致校验矩阵计算

目录 T1T2T3 T1 设二元(7,4)码的生成矩阵为&#xff1a; G [ 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 1 1 1 0 ] G\begin{bmatrix}1&0&0&0&1&1&1\\0&1&0&0&1&0&1\\0&0&1&0&0&1&1\\0&…

数学建模与优化算法:从基础理论到实际应用

数学建模和优化算法&#xff0c;它们不仅帮助我们理解和描述复杂系统的行为&#xff0c;还能找到系统性能最优化的解决方案。本文将从基础的数学理论出发&#xff0c;逐步深入到各种优化算法&#xff0c;并探讨它们在实际问题中的应用。 思维导图文件可获取&#xff1a;https:…

关于使用K8s实现容器化作业的总时效最优调度

一、Kubernetes对总时效最优调度实现的情况 Kubernetes 可以帮助实现一定程度的时效性优化&#xff0c;但要达到“总时效性最优”还需要一些额外的配置和调度策略。以下是一些可以提升整体时效性的策略&#xff1a; 1. 资源请求和限制设置 为每个容器设置合适的资源请求和限制…

判断对象、数组的方法

判断对象的方法 Object.prototype.toString.call(obj) ‘[object Object]’ 推荐指数 &#xff1a;五颗星obj instanceof Object 推荐指数 &#xff1a;四颗星typeof obj Object 推荐指数 &#xff1a;三颗星 注意&#xff1a;null也是一个对象 typeof(null) Object obj…

基于Intel Gaudi AI加速器的大语言模型微调与推理优化赛题等你挑战 | CCF BDCI进行时

一年一度的行业盛事2024 CCF大数据与计算智能大赛&#xff08;简称2024 CCF BDCI&#xff09;又在激烈进行中啦&#xff01; 多个赛题等你挑战还没有报名的伙伴们抓紧时间咯&#xff0c;叫上你伙伴练起来吧&#xff01; 2024 CCF大数据与计算智能大赛 CCF大数据与计算智能大…

使用 FastGPT 工作流搭建 GitHub Issues 自动总结机器人

如今任何项目开发节奏都很快&#xff0c;及时掌握项目动态是很重要滴&#xff0c;GitHub Issues 一般都是开发者和用户反馈问题的主要渠道。 然而&#xff0c;随着 Issue 数量的增加&#xff0c;及时跟进每一个问题会变得越来越困难。 为了解决这个痛点&#xff0c;我们开发了…

GEE 高阶应用:下载全球任何国家的森林损失保存到assets中

目录 简介 数据 函数 filterMetadata(name, operator, value) Arguments: Returns: Collection aggregate_array(property) Arguments: Returns: List ee.Number.parse(input, radix) Arguments: Returns: Number clipToCollection(collection) Arguments: Retu…

C++ 在项目中使用vim

一&#xff1a;概述 除了掌握 Vim 的基本操作&#xff0c;利用 Vim 阅读项目源码的方法同样重要&#xff0c;这对实际项目开发大有裨益。虽然现在有许多人选择使用 VSCode&#xff0c;但在某些环境中&#xff0c;可能无法安装 VSCode 或联网下载插件&#xff0c;这时使用 Vim 就…

Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(一)认识和了解Build.cs

目录 引言 一、创建一个C插件TextureReader插件 二、Build.cs文件 三、ModuleRules 四、TextureReader插件的构造 4.1ReadOnlyTargetRules的作用 4.2TextureReaderd的构造调用 4.3设置当前类的预编译头文件的使用模式 4.4PublicIncludePaths.AddRange与PrivateInclude…

探索C嘎嘎:初步接触STL

#1024程序员节&#xff5c;征文# 前言&#xff1a; 在前文小编讲述了模版初阶&#xff0c;其实讲述模版就是为了给讲STL提前铺垫&#xff0c;STL是C中很重要的一部分&#xff0c;各位读者朋友要知道它的份量&#xff0c;下面废话不多说&#xff0c;开始走进STL的世界。 目录&am…

指令系统 I(指令的格式、寻址)

一、指令系统 1. 指令集体系结构 指令&#xff08;机器指令&#xff09;是指示计算机执行某种操作的命令&#xff0c;是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统&#xff0c;也称指令集。 指令系统是指令集体系结构&#xff08;ISA&#xf…