当前位置: 首页 > news >正文

Android App的几个核心概念

Application启动

点击桌面图标启动App(如下流程图)

针对以上流程图示:

  • ActivityManagerService#startProcessLocked()
  • Process#start()
  • ActivityThread#main(),入口分析的地方
  • ActivityThread#attach(),这个里面的逻辑很核心 ActivityManagerService#attachApplication(),通过Binder机制调用了ActivityManagerService的attachApplication
  • ActivityManagerService#attachApplicationLocked(),整个应用进程已经启动起来
  • ActivityManagerService#thread.bindApplication,具体回到ActivityThread
  • ActivityThread.ApplicationThread#bindApplication(),最后看到sendMessage处理bind逻辑
  • ActivityThread#handleBindApplication(),设置进程的pid,初始化进程信息
  • ActivityThread#mInstrumentation.callApplicationOnCreate,看到Application进入onCreate()方法中,这就是从最开始main()方法开始到最后的Application的onCreate()的创建过程

Window创建

如何创建Window

在创建Activity实例的同时,会调用Activity的内部方法attach方法完成window的初始化。Activity类中相关源码如下所示:

final void attach(Context context, ActivityThread aThread,Instrumentation instr, IBinder token, int ident,Application application, Intent intent, ActivityInfo info,CharSequence title, Activity parent, String id,NonConfigurationInstances lastNonConfigurationInstances,Configuration config, String referrer, IVoiceInteractor voiceInteractor,Window window, ActivityConfigCallback activityConfigCallback) {//创建 PhoneWindowmWindow = new PhoneWindow(this, window, activityConfigCallback);
}
  • Window是一个抽象类,具体实现是PhoneWindow。PhoneWindow中有个内部类DecorView,通过创建DecorView来加载Activity中设置的布局R.layout.activity_main
  • 创建Window需要通过WindowManager创建,通过WindowManager将DecorView加载其中,并将DecorView交给ViewRoot,进行视图绘制以及其他交互

Android组件设计

ActivityManagerService

  • 启动组件
    • 组件启动时,检查其所要运行在的进程是否已创建。如果已经创建,就直接通知它加载组件。否则,先将该进程创建起来,再通知它加载组件。
  • 关闭组件
    • 组件关闭时,其所运行在的进程无需关闭,这样就可以让组件重新打开时得到快速启动。
  • 维护组件状态
    • 维护组件在运行过程的状态,这样组件就可以在其所运行在的进程被回收的情况下仍然继续生存。
  • 进程管理
    • 在适当的时候主动回收空进程和后台进程,以及通知进程自己进行内存回收
    • 组件的UID和Process Name唯一决定了其所要运行在的进程。
    • 每次组件onStop时,都会将自己的状态传递给AMS维护。
    • AMS在以下四种情况下会调用trimApplications来主动回收进程:
      • A.activityStopped,停止Activity
      • B.setProcessLimit,设置进程数量限制
      • C.unregisterReceiver,注销Broadcast Receiver
      • D.finishReceiver,结束Broadcast Receiver

Binder

  • 为组件间通信提供支持
    • 进程间;进程内都可以
  • 高效的IPC机制
    • 进程间的组件通信时,通信数据只需一次拷贝
    • 进程内的组件通信时,跳过IPC进行直接的通信

说一说DecorView

DecorView是什么

  • DecorView是FrameLayout的子类,它是Android视图树的根节点视图
    • DecorView作为顶级View,一般情况下内部包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下三个部分,上面是个ViewStub,延迟加载的视图(设置ActionBar,根据Theme设置),中间的是标题栏(根据Theme设置,有的布局没有),下面的是内容栏。
<LinearLayout ><ViewStubandroid:id="@+id/action_mode_bar_stub"/><FrameLayout><TextViewandroid:id="@android:id/title"/></FrameLayout><FrameLayoutandroid:id="@android:id/content"/>
</LinearLayout>
  • 上面的id为content的FrameLayout中,在代码中可以通过content来得到对应加载的布局
ViewGroup content = (ViewGroup)findViewById(android.R.id.content);
ViewGroup rootView = (ViewGroup) content.getChildAt(0);

Activity 与 PhoneWindow 与 DecorView 关系

一个 Activity 对应一个 PhoneWindow,一个 PhoneWindow 持有一个 DecorView 实例,DecorView 本身是一个 FrameLayout。

如何创建DecorView

  • 从Activity中的setContentView()开始
    • 在Activity中的attach()方法中,生成了PhoneWindow实例。既已有Window对象,那么就可以设置DecorView给Window对象了。
    • 从中获取mContentParent。获得到后,通过installDecor方法生成DecorView,源码中操作比较复杂,大概先从主题中获取样式,根据样式加载对应的布局到DecorView中,为mContentParent添加View,即Activity中的布局。

Android 学习笔录

Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap

相关文章:

Android App的几个核心概念

Application启动 点击桌面图标启动App(如下流程图) 针对以上流程图示&#xff1a; ActivityManagerService#startProcessLocked()Process#start()ActivityThread#main()&#xff0c;入口分析的地方ActivityThread#attach()&#xff0c;这个里面的逻辑很核心 ActivityManagerS…...

window10安装telnet

1、打开控制面板 2、点击程序和功能 3、点击启用或关闭Windows功能 4、选中Telnet客户端&#xff0c;然后点击确定&#xff0c;然后就可以使用telnent 主机 端口来查看本地是否能连通该主机的该端口。...

大厂sql真题讲解(黑马)

2023 http://yun.itheima.com/open/853.html | 面试宝典-如何备战大厂SQL真题 http://yun.itheima.com/open/858.html | 面试宝典–大厂必考知识开窗函数 http://yun.itheima.com/open/864.html | 面试宝典-详解美团SQL真题 http://yun.itheima.com/open/868.html | 图解大…...

SpringBoot整合EasyExcel实现读操作

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot整合EasyExcel实现读操作 ⏱️ 创作时间&#xff1a; 2023年…...

go mod 设置国内源 windows 环境 win10

启用 go module 功能 go env -w GO111MODULEon 配置 goproxy 变量 go env -w GOPROXYhttps://goproxy.cn,direct 下载包就行了&#xff0c;速度飞快 go mod tidy 检测 goproxy 是否配置好 运行 go env | findstr goproxy 查看 goproxy Go module 从 Go v1.12 版本开始存在&a…...

智能决策支持系统实现的关键技术分析

1.模 型 中 的 关 键 因 素 。 在 按 本 模 型 研 究 开 发 系 统 时 ,应 当 着 重 考 虑 以 下 几 个 因 素 : (1)设 备 保 护 需 求 计 划 。 保 护 需 求 包 括 了 人 员 、 物 质 、 财 务 等 各项 因 素 ; (2)考 虑 设 备 运行 及维修的 历史数据。 这是进 行 模 型 选 择…...

OSS对象存储后端实现+Vue实现图片上传【基于若依管理系统开发】

文章目录 基本介绍术语介绍图片上传方式介绍普通上传用户直传应用服务器签名后直传 OSS对象存储后端实现maven配置文件配置类ServiceController 图片上传前端图片上传组件api页面使用组件组件效果 基本介绍 术语介绍 Bucket&#xff08;存储空间&#xff09;&#xff1a;用于…...

人工智能学习目录

1、人工智能-电脑如何像人一样思考&#xff1f; 从发展历史到人工智能的应用案例&#xff0c;再到人工智能本质是数学问题&#xff0c;从房价预测问题提出损失函数由参数导致&#xff0c;再由损失函数的最优值入手引入梯度下降法&#xff0c;最后到多参数方程的最优求解。 人工…...

Vue单页面实现el-tree el-breadcrumb功能、el-tree右键点击树节点展示菜单功能、树节点编辑节点字段名称功能

(1) 点击el-tree节点 使用el-breadcrumb展示选中树节点及父项数据 重点&#xff1a;handleNodeClick方法、getTreeNode方法 (2) 选择el-breadcrumb-item设置el-tree节点选中 必须设置属性: current-node-key"currentNodeKey" 、 node-key"id" 重点: 设置…...

C++核心编程之函数高级使用

目录 一、函数的默认参数 二、函数占位参数 三、函数重载 四、函数重载-注意事项 一、函数的默认参数 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 语法&#xff1a;返回值类型 函数名 &#xff08;参数默认值&#xff09;{} 示例1&#xff1a; #includ…...

如何创建智能合约游戏系统

区块技术的发展&#xff0c;智能合约成为了一个热门话题。智能合约是一种基于区块技术的自动化合约&#xff0c;它可以自动执行合同中规定的条款&#xff0c;从而实现去中心化的信任和价值传递。在游戏领域&#xff0c;智能合约可以让玩家在游戏中实现各种交易和交互&#xff0…...

如何用rust实现一个异步channel

目录 前言思路实现功能代码实现 测试先引测试版包测试代码结果与分析思考 尾语 前言 使用通信来共享内存&#xff0c;而不是通过共享内存来通信 上面这句话&#xff0c;是每个go开发者在 处理多线程通信时 的座右铭&#xff0c;go甚至把实现这个理念的channel直接焊在编译器里&…...

gitee上传项目到仓库

目录 一些常用的Git命令切换到其他盘符&#xff1a;列出目录下的所有文件&#xff1a;以树状图的形式显示目录下的文件和子目录:返回上一层目录&#xff1a;写的C#代码文件上传到新建的Git仓库中&#xff0c;可以按照以下步骤进行操作&#xff1a;出现的错误&#xff1a; 一些常…...

day27 贪心算法

1.什么是贪心&#xff1f; 比如10张钞票&#xff0c;有1&#xff0c;5&#xff0c;20&#xff0c;100等面额&#xff0c;取五张&#xff0c;如何取得到数额最多的钱&#xff1f;每次取面额最大的那张钞票&#xff1b;就是每个阶段的局部最优&#xff1b;全局最优就是最后拿到的…...

Java实现字符串反转

起因 自己在刷题的过程中&#xff0c;想把一个字符串翻转一下&#xff0c;便写了下面的代码&#xff1a; String str "abcd";str str.reverse();发现行不通&#xff0c;这是为什么呢&#xff1f; 分析 在Java中&#xff0c;字符串是不可变的对象&#xff0c;这意…...

vue - 常见的性能优化

文章目录 vue使用中常见的性能优化1&#xff0c; v-for 遍历避免同时使用 v-if2&#xff0c; 如果需要使用v-for给每项元素绑定事件时 可以使用事件代理**3&#xff0c; 一些数据不做响应式4&#xff0c;一些页面采用keep-alive缓存组件5&#xff0c;第三方UI库按需导入6&#…...

微服务系列文章 之 Nginx服务状态监控的方法

在Nginx的插件模块中有一个模块stub_status可以监控Nginx的一些状态信息&#xff0c;默认安装可能没有这个模块&#xff0c;手动编译的时候加一下即可。 1. 模块安装 先使用命令查看是否已经安装这个模块&#xff1a; [rootihxb123Z nginx]# ./nginx -V (V大写会显示版本号和…...

【网络系统集成】路由器实验

1.实验名称:路由器RIP协议配置 2.实验目的 在PacketTracer中进行模拟实验,配置RIP协议,验证RIP协议更新时间及路由状态变化,加深对路由器RIP协议相关知识的理解与掌握。 3.实验内容 (1)拓扑结构图 (2)ip地址分配与端口分配...

【mac 安装Miniconda】

1.下载Miniconda 注意mac是什么版本&#xff0c;m1下载m1版本 https://docs.conda.io/en/latest/miniconda.html#macos-installers 2.安装Miniconda 在下载文件所在目录下打开终端&#xff0c;输入一下命令&#xff1a; bash Miniconda3-latest-MacOSX-x86_64.sh 一路回车&…...

螺栓疲劳计算-风电行业,参考GL2010, ST0361,1993-1-9

由于不想再重新排版了&#xff0c;于是转成了图片。...

计算机毕业设计springboot基于Android的运动助手 基于SpringBoot框架的个人健身管理平台设计与实现 面向Android用户的智能运动健康追踪系统开发

计算机毕业设计springboot基于Android的运动助手c6672log &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着现代生活节奏加快和工作压力增大&#xff0c;健康问题日益受到人们…...

HFSS新手避坑指南:从零搭建Dipole天线,手把手搞定S11与3D方向图

HFSS新手避坑指南&#xff1a;从零搭建Dipole天线&#xff0c;手把手搞定S11与3D方向图 第一次打开HFSS时&#xff0c;满屏的英文菜单和复杂的参数设置界面&#xff0c;很容易让人望而生畏。特别是当导师或老板扔给你一个简单的Dipole天线仿真任务&#xff0c;要求你"尽快…...

Qwen3-32B内容创作应用:自动生成文案、报告、邮件

Qwen3-32B内容创作应用&#xff1a;自动生成文案、报告、邮件 1. 为什么选择Qwen3-32B进行内容创作 在当今内容为王的时代&#xff0c;企业每天都需要产出大量高质量的文字内容。从营销文案到产品说明&#xff0c;从客户邮件到内部报告&#xff0c;文字创作已经成为企业运营中…...

突破静态界限:LivePortrait肖像动画技术深度解析

突破静态界限&#xff1a;LivePortrait肖像动画技术深度解析 【免费下载链接】LivePortrait Bring portraits to life! 项目地址: https://gitcode.com/GitHub_Trending/li/LivePortrait 你是否曾想过&#xff0c;让一张普通的照片或一幅古典油画中的人物"活"…...

NoFences:免费开源的Windows桌面图标分区管理工具终极指南

NoFences&#xff1a;免费开源的Windows桌面图标分区管理工具终极指南 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 当你的Windows桌面被各种文件、快捷方式和应用程序图标…...

python numpy包的使用

文章目录比较常用的功能计算相似度计算矩阵有人问 求平均数还不简单&#xff0c;还用的着mean()方法吗?np.sum()方法计算矩阵的行和与列和keepdims求和后保持结果的维度不变示例np.sum()的内置参数非常强的一个包&#xff0c;在数组、矩阵、向量计算方面极具优势。比较常用的功…...

TMS320F280049系列文章之第二章 工程搭建实战:从零配置到路径设置的避坑指南

1. 工程准备与环境搭建 第一次接触TMS320F280049开发的朋友&#xff0c;可能会被复杂的工程配置劝退。别担心&#xff0c;跟着我的步骤走&#xff0c;保证你能顺利搭建第一个工程。我用的环境是CCS10.3.1和C2000Ware_4_01&#xff0c;这也是目前比较稳定的组合。 先说说准备工作…...

Verilog新手避坑指南:从HDLBits的Getting Started到Vectors,我踩过的那些坑

Verilog新手避坑指南&#xff1a;从HDLBits的Getting Started到Vectors&#xff0c;我踩过的那些坑 第一次接触Verilog时&#xff0c;我像大多数初学者一样&#xff0c;被它既像C语言又不像C语言的语法搞得晕头转向。HDLBits这个在线练习平台确实是个好帮手&#xff0c;但当我从…...

掌握4大核心策略,让你的暗黑3效率提升200%:D3KeyHelper自动化配置全指南

掌握4大核心策略&#xff0c;让你的暗黑3效率提升200%&#xff1a;D3KeyHelper自动化配置全指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3Ke…...

如何高效解锁拯救者Y7000系列BIOS隐藏选项:终极完整指南

如何高效解锁拯救者Y7000系列BIOS隐藏选项&#xff1a;终极完整指南 【免费下载链接】LEGION_Y7000Series_Insyde_Advanced_Settings_Tools 支持一键修改 Insyde BIOS 隐藏选项的小工具&#xff0c;例如关闭CFG LOCK、修改DVMT等等 项目地址: https://gitcode.com/gh_mirrors…...