当前位置: 首页 > 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…...

swagger的简单介绍

目录 swagger是什么&#xff1f; swagger有什么用&#xff1f; Swagger包含的工具集&#xff1a; swagger的使用步骤&#xff1a; swagger的相关注解&#xff1a; Docket的源码 了解swagger的作用和概念了解前后端分离在SpringBoot中集成Swagger swagger是什么&#xff1f;…...

HNU-电路与电子学-小班3

第三次讨论 1 、直接用晶体管而不是逻辑门实现异或门&#xff0c;并解释这个电路是如何工作的。 &#xff08;6个 MOS 管构成&#xff09; 2 、通信双方约定采用 7 位海明码进行数据传输。请为发送方设计海明码校验位 生成电路&#xff0c;采用功能块和逻辑门为接收方设计海…...

[机缘参悟-98] :层次不同、维度不同、视角不同、结论不同

目录 全局VS具备&#xff0c; 总体V部分 认知的六个认知层次&#xff1a; 认知的六个立体化维度&#xff1a; 0、维空间&#xff0c;点思维 1、一维空间&#xff0c;直线思维 2、二维空间&#xff0c;平面思维 3、三维空间&#xff1a;立体思维。 4、四维空间&#xff…...

chatgpt-web发布之docker打包流程

docker打包流程 1、使用docker前置准备&#xff1a; 电脑下载docker桌面版&#xff0c;以及开启虚拟机步骤&#xff1a;https://blog.csdn.net/qq_34905631/article/details/126573826下载docker桌面版 &#xff1a;https://docs.docker.com/desktop/install/windows-install…...

动态优化会议地点

前言 在现在快节奏的工作节奏下&#xff0c;大家的活动范围越来越广&#xff0c;但是出行成本也相应提高。在集体会面的时候&#xff0c;如何选择合适的地点成为了一个棘手的问题。本文将介绍如何通过动态优化选择会议地点&#xff0c;以达到平均交通成本最低的目标。 动态优化…...

Golang每日一练(leetDay0076) 第k大元素、组合总和III

目录 215. 数组中的第K个最大元素 Kth-largest-element-in-an-array &#x1f31f;&#x1f31f; 216. 组合总和 III Combination Sum iii &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日…...

可节省60% MCU开发成本的NV080D-S8,单片机语音芯片在恒温碗上的应用

社会在不断进步&#xff0c;科技在不断发展&#xff0c;如今的恒温碗不仅带有温度显示功能&#xff0c;更附带有语音播报&#xff0c;能更好地知晓当前饭菜&#xff0c;变凉或过烫的情况&#xff0c;有效避免伤害宝宝脆弱的肠胃&#xff1b; 广州九芯电子推出了一款&#xff0c…...

Java并发常见面试题

参考:javauide、程序员大斌、面试宝典 1.并发与并行的区别 并发:两个及两个以上的作业在同一 时间段 内执行。并行:两个及两个以上的作业在同一 时刻 执行。2.同步和异步的区别 同步:发出一个调用之后,在没有得到结果之前, 该调用就不可以返回,一直等待。异步:调用在发…...

基于vue3+pinia2仿ChatGPT聊天实例|vite4.x仿chatgpt界面

使用vue3pinia2开发仿制chatgpt界面聊天实例Vue3-Chatgpt 基于Vue3.xPinia2VueRouterVue3-Markdown等技术构建仿ChatGPT网页端聊天程序。支持经典分栏界面布局、light/dark模式、全屏半屏显示、Markdown语法解析、侧边栏隐藏等功能。 技术框架 编辑工具&#xff1a;Cursor框架…...

JDK动态代理和CGLIB动态代理

JDK动态代理和CGLIB动态代理 JDK动态代理和CGLIB动态代理 JDK动态代理和CGLIB动态代理 ① JDK动态代理只提供接口的代理&#xff0c;不支持类的代理&#xff0c;要求被代理类实现接口。JDK动态代理的核心是InvocationHandler接口和Proxy类&#xff0c;在获取代理对象时&#x…...