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

八股总结(六):Android基础:四大组件与UI控件

文章目录

  • Activity
    • 一个APP的启动过程
    • 基本概念
      • 总图
      • zygote是什么?有什么作用?
      • SystemServer是什么?有什么用,与zygote的关系是什么?为什么称为服务端对象?
      • APP、AMS、zygote是三个独立的进程,他们之间如何通信呢?(IPC通信方式)
      • Launcher是什么?什么时候启动的?
      • Instrumentation是什么?和ActivityThread是什么关系
      • ActivityStack和ActivityRecord是什么关系?
      • 一个APP的程序入口是什么?APP的主线程消息循环在哪里创建?
    • Activity的生命周期
      • 如果在一个Activity中启动另外一个Activity执行过程是怎么样的?
    • Activity的启动方法
    • IntentFilter匹配规则
    • Activity的四种启动模式
    • 造成Activity卡顿的原因及解决方法
  • Fragment
    • Fragment生命周期
      • Fragment生命周期与Activity生命周期对比

Activity

一个APP的启动过程

基本概念

  • ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期。
  • ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作。
  • ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。
  • ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。
  • Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
  • ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
  • ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
  • TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生。

总图

在这里插入图片描述

zygote是什么?有什么作用?

fork是Unix/Linux操作系统中的一个用于创建新进程的系统调用函数,fork会复制原进程的所有内容包括代码、数据和内存空间。

zygote:直译为受精卵zygote 是一个进程的名字,Android是基于Linux系统的,当手机开机后,Linux内核加载完成之后就会启动一个init 的进程,在Linux系统中,所有的的进程都是init进程fork出来的,zygote进程也不例外。

每一个APP其实都是:

  • 一个单独的dalvik虚拟机
  • 一个单独的进程

当系统里边的第一个zygote进程运行之后,开启APP,就相当于新开启一个进程,而为了实现资源共用和更快的启动速度,Android系统开启新进程的方式是通过fork一个zygote进程实现的。就像受精卵这种有遗传物质的细胞一样,快速进行分裂。

SystemServer是什么?有什么用,与zygote的关系是什么?为什么称为服务端对象?

zygote进程后开启后会执行startSystemServer(),fork出SystemServer进程

SystemServer是Android Framework中除zygote外另一个十分重要的线程,系统里边的重要服务:ActivityManagerService、PackageManagerService、WindowManagerService都在这个线程中开启。

服务端/客户端模型不仅仅存在于Web开发中,在Android框架设计中也是这种模式,服务端是所有APP共有的系统服务,比如上边提到到AMS(活动管理服务)、PMS(包管理服务)、WMS(窗口管理服务),而客户端指的就是Android系统上的各种APP,当某个APP要实现某个操作,需要告诉这些系统服务,例如如果想要打开一个App,最终是由AMS通知zygote进程来fork一个新进程,进而开启目标APP的。

APP、AMS、zygote是三个独立的进程,他们之间如何通信呢?(IPC通信方式)

APP与AMS通过Binder进行IPC通信,AMS与zygote通过Socket进行IPC通信。

APP与AMS之间的通信:
APP相当于客户端,AMS相当于服务端,Binder通信的单向的;

具体实现时采用了代理模式,ActivityManagerProxy作为AMS在客户端的代理人,接收客户端的请求参数,通过Binder驱动传输到服务器的AMS实际执行请求。

ApplicationThreadProxy作为APP在服务端的代理人,

客户端 ActivityManagerProxy ----->Binder驱动---->ActivityManagerService:服务器

客户端ApplicationThread <------Binder驱动 <------ ApplicationThreadProxy:服务器

Launcher是什么?什么时候启动的?

当我们点击手机桌面上的图标时,App就由Launcher开始启动,Launcher本质上也是一个应用程序,和我们的App一样,也是继承自Activity,Launcher实现了点击、长按等回调接口,来接收用户的输入。Launcher中开启一个App,其实和我们在Activity中直接startActivity()基本一样,都是调用了Activity.startActivityForResult()。

Instrumentation是什么?和ActivityThread是什么关系

每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象。Instrumentation翻译为“仪器/手段”,Instrumentation对象包含有很多与Activity生命周期相关的方法,它就像是应用进程的管家。

ActivityThread是APP运行的主线程,也是UI线程,AMS对于Activity的调度信息会通过Binder通信传给 ActivityThread,而ActivityThread是委托Instrumentation来实际执行对Activity生命周期的控制。

ActivityStack和ActivityRecord是什么关系?

每个Activity在AMS对应一个ActivityRecord对象,包含了Activity的状态和管理信息,是Activity实体在AMS的映像。

ActivityStack是Activity在AMS的栈管理,ActivityStack中存放的对象就是ActivityRecord。

一个APP的程序入口是什么?APP的主线程消息循环在哪里创建?

APP的程序入口是ActivityThread.main()
整个APP的主线程消息循环在ActivityThread初始化时就已经创建好了消息循环,所以在主线程里边创建Handler不需要执行Looper,而如果在其他线程里边使用Handler,则需要单独使用Looper.prepare()和Looper.loop(),创建消息循环。

Activity的生命周期

onCreate()->onStart()->onResume()->onPause()->onStop()->onDestroy()

如果在一个Activity中启动另外一个Activity执行过程是怎么样的?

()中的参数1、2表示Activity的标识。

onCreate(1)->onStart(1)->onRusume(1)->onPause(1)->onCreate(2)->onStart(2)->onRusume(2)->onStop(1)->在Activity2中返回->onPause(2)->onStart(1)->onResume(1)->onStop(2)->onDestroy(2)
在这里插入图片描述

Activity的启动方法

  • 显示启动;

// 1. 使用intent的构造函数 指明context和待启动的activity的class对象。
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

// 2. 使用 setClassName()传入 包名+类名 / 包Context+类名
Intent intent = new Intent();
// 方式1:包名+类名
// 参数1 = 包名称
// 参数2 = 要启动的类的全限定名称
intent.setClassName(“com.hc.hctest”, “com.hc.hctest.SecondActivity”);

// 方式2:包Context+类名
// 参数1 = 包Context,可直接传入Activity
// 参数2 = 要启动的类的全限定名称
intent.setClassName(this, “com.hc.hctest.SecondActivity”);

startActivity(intent);

// 3. 通过ComponentName()传入 包名 & 类全名
Intent intent = new Intent();
// 参数1 = 包名称
// 参数2 = 要启动的类的全限定名称
ComponentName cn = new ComponentName(“com.hc.hctest”, “com.hc.hctest.SecondActivity”);
intent.setComponent(cn);
startActivity(intent);

  • 隐式启动,通过设置Intent的Action(动作)、 Category(类别)和data(数据),构建一个隐式意图,在manifest.xml已经注册的组件中,按照Intent过滤规则,匹配到相应的组件。

IntentFilter匹配规则

总体匹配规则:只有Action、Category和Data同时匹配,才能成功启动Activity。
1个Activity可以有多个Intent-filter,一个Intent只要能匹配任何一组intent-filter就可以成功启动对应的activity。

在这里插入图片描述

Activity的四种启动模式

  • 标准模式(Standard)
  • 栈顶复用模式(SingleTop)
  • 栈内复用模式(SingleTask)
  • 单例模式(SingleInstance)

启动模式的设置方式:

  1. manifest.xml中指定launchMode
<activityandroid:launchMode="启动模式"
//属性
//standard:标准模式
//singleTop:栈顶复用模式
//singleTask:栈内复用模式
//singleInstance:单例模式
//如不设置,Activity的启动模式默认为**标准模式(standard)**
</activity>
  1. 通过Intent设置标志位:
Intent inten = new Intent (ActivityA.this,ActivityB.class);
intent,addFlags(Intent,FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

在这里插入图片描述

两种方式设置的区别;

  • 优先级不同
    Intent设置方式的优先级 > Manifest设置方式,即 以前者为准
  • 限定范围不同
    Manifest设置方式无法设定 FLAG_ACTIVITY_CLEAR_TOP;Intent设置方式 无法设置单例模式(SingleInstance)

造成Activity卡顿的原因及解决方法

在这里插入图片描述

Fragment

Fragment生命周期

  • Fragment 类的代码与 Activity 非常相似。它包含与 Activity 类似的回调方法,如 onCreate()、onStart()、onResume()、onPause() 、 onStop()、onDestroy()。

  • Fragment依附(Attach)于Activity的生命周期而存在。在Activity的onCreate(),我们需要执行Fragment的onAttach()、onCreate()、onCreateView()、onActivityCreated()。

  • Fragment自己独有的生命周期:onAttach、onCreateView、onActivityCreated、onDestroyView、onDetach().
    在这里插入图片描述

Fragment生命周期与Activity生命周期对比

在这里插入图片描述

相关文章:

八股总结(六):Android基础:四大组件与UI控件

文章目录 Activity一个APP的启动过程基本概念总图zygote是什么&#xff1f;有什么作用&#xff1f;SystemServer是什么&#xff1f;有什么用&#xff0c;与zygote的关系是什么&#xff1f;为什么称为服务端对象&#xff1f;APP、AMS、zygote是三个独立的进程&#xff0c;他们之…...

【P46】JMeter 响应断言(Response Assertion)

文章目录 一、响应断言&#xff08;Response Assertion&#xff09; 参数说明二、准备工作三、测试计划设计3.1、包括3.2、匹配3.3、相等3.4、字符串3.5、字符串3.6、或者 一、响应断言&#xff08;Response Assertion&#xff09; 参数说明 可以对 Jmeter 取样器的响应消息进…...

19-02 基于业务量级的架构技术选型演进

从零开始——单服务应用 单体应用技术选型 &#xff08;GitHub、Gitee…&#xff09;搜索是否有线程的产品用最熟悉的技术&#xff0c;最快的速度上线如果有经费&#xff1a;考虑商业化解决方案 个人小程序怎么做技术选型的 搜索是否有快速搭建下程序的软件技术选型 后端技…...

Server - 高性能的 PyTorch 训练环境配置 (PyTorch3D 和 FairScale)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130863537 PyTorch3D 是基于 PyTorch 的 3D 数据深度学习库&#xff0c;提供了高效、模块化和可微分的组件&#xff0c;以简化 3D 深度学…...

小猫踩球-第14届蓝桥杯省赛Scratch中级组真题第2题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第137讲。 小猫踩球&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程中级组真题第2题&#xf…...

嵌入式开发从入门到精通之第二十一节:三轴加速度传感器(BMA250E)

目录 1、工作模式 2、中断支持的模式 2.1 新数据的产生 2.2 任何斜率的变化的监测...

代码随想录算法训练营第三十六天|435. 无重叠区间 763.划分字母区间 56. 合并区间

目录 LeeCode 435. 无重叠区间 LeeCode 763.划分字母区间 LeeCode 56. 合并区间 LeeCode 435. 无重叠区间 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 思路1&#xff1a;按照右边界排序&#xff0c;从左向右记录非交叉区间的个数。最后用区间总数减去非交叉…...

shell 脚本

Shell概述 shell是一个命令行解释器&#xff0c;它接收应用程序/用户命令&#xff0c;然后调用操作系统内核 脚本入门 脚本格式 脚本以#!/bin/bash开头&#xff08;指定解析器&#xff09; helloworld # 创建脚本 [linuxlocalhost datas]$ cat helloworld.sh #!/bin/bas…...

Linux :: 【基础指令篇 :: 用户管理(补充):(4)】::用户切换

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 目录索引&am…...

打印机无法扫描的原因及解决方法

在家庭和办公环境中&#xff0c;打印机已成为不可或缺的设备。它不仅可以打印文件&#xff0c;还可以扫描文档并将它们转换为数字数据。但有时&#xff0c;打印机可能无法扫描文档或图片。以下是可能导致这些问题的原因和解决方法。 出现打印机无法扫描的原因&#xff1a; 1.…...

【Mysql】 数据类型

文章目录 【Mysql】 数据类型数据类型分类数值类型1. tinyint类型2. bit类型3. 小数类型 字符串类型1.char2.varchar3. 日期和时间类型4. enum 和 set 【Mysql】 数据类型 mysql中数据类型的作用&#xff1a; 约束操作者的行为更清晰的代码逻辑不同的功用 – 例如&#xff0c…...

mysql中如何使用乐观锁和悲观锁

MySQL中可以使用SELECT ... FOR UPDATE语句来实现悲观锁。这个语句会在查询时锁定被查询的行&#xff0c;在事务结束前都不会释放锁。 例如&#xff0c;我们可以使用以下的 SQL 语句来锁定一个特定的行&#xff1a; BEGIN; SELECT * FROM table WHERE id 1 FOR UPDATE; ... C…...

Logstash技术栈总结

Logstash 是一个可以传输和处理你的日志、事务或其他数据的功能强大的工具&#xff0c;可与各种部署集成。 它提供了大量插件&#xff0c;可帮助你解析&#xff0c;丰富&#xff0c;转换和缓冲来自各种来源的数据。 工作原理 Logstash 事件处理有三个阶段&#xff1a;inputs …...

解决:在单项目组件里面引入 base.scss/ base.less 等的外部文件不成功的问题

1、问题展示&#xff1a; 其一、问题描述&#xff1a; 在单文件组件里面使用封装在 base.scss 或 base.less 里面的样式用法一直不成功&#xff1b; 其二、代码&#xff1a; // 虽然已经标明了用的是 scss 的语法&#xff0c;但是页面调用 .scss 里的 style 样式还是不成功&a…...

论文分享 | WSBERT:Weighted Sampling for Masked Language Modeling

本次分享阿里巴巴达摩院语音实验室、新南威尔士大学与香港科技大学&#xff08;广州&#xff09;等在ICASSP2023会议发表的论文《Weighted Sampling for Masked Language Modeling》。该论文主要提出了两种简单有效的加权采样策略&#xff0c;来缓解掩码语言模型&#xff08;ML…...

java 在线音乐网站系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java 在线音乐网站系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助struts2开发技术&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mys…...

软件测试基础教程学习1

文章目录 软件测试概述1.1 什么是软件测试1.2 软件测试的目的1.3 对软件测试的理解1.4 软件测试的原则1.5 测试人员的职责1.6 测试人员的素质要求 软件测试概述 1.1 什么是软件测试 1&#xff09;软件测试要发现软件的错误。 2&#xff09;软件测试最终要以软件满足用户需求为…...

浅谈一下@Async和SpringSecurityContext可能会遇到的问题和解决方案

Async和SpringSecurityContext 场景回溯 在执行一个用时较长的批量插入业务的时候,我尝试使用Async异步对业务进行优化,但是却给我报了空指针的错误,定位之后发现 此处我是基于SpringSecurity来获取用户的 是currentUserService获取到的当前登陆用户为空导致的,但是当前确实是…...

VUE常见面试题

1.为什么要使用Vue&#xff1f; 答&#xff1a;Vue是一款优秀的前端框架&#xff0c;它可以帮助我们快速构建高效、可复用、易维护的Web应用程序&#xff0c;并提供了丰富的API和生态系统。 2. Vue有哪些生命周期钩子函数&#xff1f; 答&#xff1a;Vue有8个生命周期钩子函…...

字符串匹配算法--KMP算法--BM算法

该算法解决的是字符串匹配问题&#xff0c;即查看字符串中是否含有完整的匹配字符串。如在java的string的contains方法匹配问题最简单的就是暴力破解了。在java的contains也是这么实现的&#xff0c;效率是低一点的。如果想要更快的速度可以自己写KMP算法。 代码实现体验 Knut…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...