Android 基础篇

Android 应用框架

Android 应用组件

对Android应用程序而言,应用组件主要由Activity、Service、Broadcast Receivers、Intent、Content Providers、AndroidManifest等构成。

Activity是与用户直接交互UI组件; Service是运行在后台、用户不可见的服务组件;Broadcast Receivers是进行系统消息广播的广播组件;Intent是应用组件间、进程间进行通信的通信组件;Content Providers是不同应用间传递、分享数据的内容组件;Android Manifest为应用程序的管理组件。

其他组件还有App Widgets、Graphics、Audio and Video、Data Storage、Resources等

Activity

在通常情况下,Activity作为一个全屏的窗口出现,也可以作为浮动窗口或者其他Activity的子Activity出现。

在Android中,Activity的管理是通过Activity栈的方式来进行的,在Activity的生命周期中,存在4种状态:激活(active)、运行(running)、停止(stopped)、暂停(paused)。

主要的Activity属性包括:taskAffinity 、launchMode 、allowTaskReparenting 、clearTaskOnLaunch 、alwaysRetainTaskState finishOnTaskLaunce等。

Services

服务(Services)组件通常运行在后台,对用户而言不具有可视性,守护进程和硬件服务、原生服务等多是服务组件。

AIDL 接口:

服务根据驻留的对象不同可以分为本地服务(Local Services)和远程服务(Romate Services)

一般将远程服务分为应用级远程服务和系统级远程服务两种

系统级的服务实现颇为复杂。除了定义服务本身外,还需要定义被上层应用调用的接口。一般通过AIDL调用。而应用级远程服务除了AIDL外,Android还提供了较为简单的Message方式的调用。但如果实现的服务希望被其他应用调用,则必须通过AIDL进行。

Broadcast Receivers

广播接收器(Broadcast Receivers)是用来接收或者响应广播、通告的一个应用组件,它与通知管理器密切相关。当时区发生改变、电量不足、工作语言发生改变等事件发生时,注册相应广播接收器的应用将会收到这些信息。

广播分为两种类型:标准广播(Normal broadcasts)、顺序广播(Ordered broadcasts)

标准广播指广播是完全异步的,所有的接收器处于无序的运行状态。这类广播通过Context.sendBroadcast()方法发送。

顺序广播则按照一定的优先级进行广播,高优先级的接收器向低优先级的接收器转播广播

Intent

在Android中,应用组件也是通过Intent来激活的,其中内容提供器是通过ContentResolver发出请求的方式来激活的,而Activity、服务和广播接收器则是通过所谓的Intent异步消息的方式来激活的。

利用Intent激活组件的操作方法有:startActivity(Intent)、startService(Intent)、bindService(Intent, ServiceConnection, int)、sendBroadcast(Intent)等,其中startActivity()方法用于发起Activity,startService()方法用于发起服务,bindService()方法用于绑定服务,而sendBroadcast()方法则用来向所有关联的广播接收器发送广播。

在通信过程中,Intent负责对通信消息进行描述,Android则根据Intent的描述,找到匹配的组件,将Intent传递给匹配的组件,并完成组件的调用。

Intent在通信过程中起着媒介的作用,专门传递组件互相调用的相关信息,实现了调用者与被调用者之间的解耦

在Android中,Intent携带的信息主要有两种属性:行为(Action)和数据(Data)。其他属性还有类别(Category)、数据类型(Type)、组件(Component)、附加信息(extras)等。

Content Providers

内容提供器(Content Providers)是Android提供的一个在不同应用间传递、分享数据的机制,这些数据可以存储在文件系统、SQLite数据库等中。

Android Manifest

在Android启动应用之前,它必须了解应用组件的情况,在Android中,应用运行涉及的多数应用组件都必须在AndroidManifest.xml中声明

对于Activity,对应的元素为“activity”;对于服务,对应的元素为“service”;对于广播接收器,对应的元素为“receiver”;对于内容提供器,对应的元素为“provider”

对于系统定义的Action,默认的前缀为android.intent.action,

常用的Action有android.intent.action.MAIN、android.intent.action.WEB_SEARCH。

对于开发者自定义的Action,建议以所在包的包名作为前缀以保证命名的唯一性,

如com.miaozl.helloworld.TRANSMOGRIFY。

Activity 和Tasks

作为和用户之间直接交互的UI组件,Activity执行的是一个窗口的功能,Tasks则是Activity的堆栈

进程和线程

在默认情况下,每个应用均运行在其独自拥有的Linux进程中,而每个进程拥有一个唯一的Java虚拟机(Dalvik)和一个唯一的Linux用户ID。

组件生命周期

Activity生命周期

在系统中,Activity由Activity栈即Tasks来管理,Activity在其整个生命周期中,有4个状态:运行(running)、暂停(paused)、停止(stopped)、销毁(Destroyed)

1.当一个Activity被置于前台时,该Activity处于“running”状态

2.当一个Activity失去焦点但仍然可视时,该Activity处于“paused”状态

3.当一个Activity完全不可视时,该Activity处于“stopped”状态

4.当一个Activity因为某种原因被销毁时,该Activity将处于“Destroyed”状态

Services生命周期

服务通常作为后台进程运行,通过Context.startService()方法可以启动服务,如果需要销毁一个服务,则可以调用Context.stopService()、Service.stopSelf()、Service.stopSelfResult()等方法。

当客户端需要和服务进行绑定来利用服务时,需要调用Context.bindService()方法,结束绑定需要调用Context.unbindService()方法

Broadcast Receivers生命周期

Broadcast Receivers

void onReceive(Context curContext, Intent broadcastMsg)

当一个广播消息到达时,Android会调用BroadcastReceiver ::onReceive()方法来处理消息,在处理过程中,广播接收器处于激活状态,当处理结束时,广播接收器处于去活状态

注册一个广播接收器的方法为Context::registerReceiver(BroadcastReceiver,IntentFilter)

进程生命周期

在Android中,根据进程中运行的组件,以及组件的状态将进程分为5类:

前台进程(foreground process)、可视进程(visible process)、服务进程(service process)、后台进程(background process)、空进程(empty process)

1)前台进程当一个进程出现如下场景时,该进程被称为前台进程。场景包括:正在运行一个与用户交互的Activity。驻留了一个与用户交互的Activity相绑定的服务。拥有一个正在执行生命周期调用(onCreate(),onStart()、onDestroy())的服务对象

2)可视进程当一个进程没有包含任何前台组件,但对用户视觉有影响时,该进程被称为可视进程。这类进程的典型场景包括弹出窗口隐藏的全屏窗口等。另外驻留了与处于“paused”状态的Activity绑定的服务进程也属于这类进程

3)服务进程当进程中驻留了一个服务组件时,该进程称为服务进程,除非系统已经没有足够的内存去运行前台进程和可视进程,否则服务进程将一直在系统中保持运行。这类进程的典型场景如Mp3的后台播放

4)后台进程当进程的所有Activity对用户而言均不可见时,对用户体验来说没有直接的影响,这些进程称为后台进程。为了满足更重要的进程的资源需求,后台进程可能会被系统杀死

5)空进程当一个进程没有驻留任何激活的应用组件时,该进程称为空进程,这类进程仍存在于系统中的原因是,作为缓冲可以提高进程的下次启动时间。但为了保证系统的正常运行,当系统资源濒临不足时,Android常会选择杀死这类进程

启动过程

Android系统启动流程详细图解

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

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

相关文章

超结MOS/低压MOS在5G基站电源上的应用-REASUNOS瑞森半导体

一、前言 5G基站是5G网络的核心设备,实现有线通信网络与无线终端之间的无线信号传输,5G基站主要分为宏基站和小基站。5G基站由于通信设备功耗大,采用由电源插座、交直流配电、防雷器、整流模块和监控模块组成的电气柜。所以顾名思义&#xf…

vue中的侦听器和组件之间的通信

目录 一、侦听器 监听基本数据类型: 监听引用数据类型: 计算属性和watch区别? 二、组件通信/传值方式 1.父子组件传值 父组件给子组件传值: (1)props (2)provide inject &…

玩转大数据20:大数据应用容器化与部署实践

一、容器化技术介绍和优势 随着云计算的快速发展,容器化技术作为一种轻量级虚拟化技术,已经成为应用部署的主要方式。容器化技术通过共享操作系统,将应用程序及其依赖项打包成一个独立的、可移植的容器,从而实现应用的快速部署和…

Android Studio: 解决Gradle sync failed 错误

文章目录 1. 前言2. 错误情况3. 解决办法3.1 获取gradle下载地址3.2 获取gradle存放目录3.3 替换并删除临时文件3.4 触发Try Again 4. 执行成功 1. 前言 今天调试项目,发现新装的AS,在下载gradle的过程中,一直显示连接失败,Gradl…

构建陪诊预约系统:技术实战指南

在医疗科技的飞速发展中,陪诊预约系统的应用为患者和陪诊人员提供了更为便捷和贴心的服务。本文将带领您通过技术实现,构建一个简单而实用的陪诊预约系统,以提升医疗服务的效率和用户体验。 技术栈选择 在开始之前,我们需要选择…

AUTOSAR CanTSyn模块配置与代码实现(二)

AUTOSAR CanTSyn模块配置与代码实现 1、FUP message处理 CanTSyn_process_FUP_message 先比较和SYNC报文的Sequence是否相等,如果不相等则不接受该报文。 然后调用CanTSyn_unpack_store_fup处理fup报文。 获取接收到FUP时的本地时间,并与接收到的SYNC…

Linux静态ip

Linux静态ip Ⅰ、修改静态ip Ⅰ、修改静态ip 修改静态ip必须是root用户 su root //切换root用户 ip a //查看修改前的动态ipvi /etc/sysconfig/network-scripts/ifcfg-ens33 //打开网卡配置文件,修改一处,新增四处 BOOTPROTO&quo…

3 使用postman批量创建测试数据

上一篇:2 使用postman进行接口测试-CSDN博客 在软件测试实际工作中,因测试需要,我们要批量创建测试数据。如果某些接口不允许输入重复数据,我们在做批量请求时就要做参数处理了。 比如在上一篇介绍的用户注册接口,一般注册的时候用户名是不允许重复的,如果要批量创…

如何入门 GPT 并快速跟上当前的大语言模型 LLM 进展?

入门GPT 首先说第一个问题:如何入门GPT模型? 最直接的方式当然是去阅读官方的论文。GPT模型从2018年的GPT-1到现在的GPT-4已经迭代了好几个版本,通过官方团队发表的论文是最能准确理清其发展脉络的途径,其中包括GPT模型本身和一…

算法基础之约数个数

约数个数 核心思想&#xff1a; 用哈希表存每个质因数的指数 然后套公式 #include <iostream>#include <algorithm>#include <unordered_map>#include <vector>using namespace std;const int N 110 , mod 1e9 7;typedef long long LL; //long l…

orangepi5plus刷自编译armbian系统

准备好一个编译主机&#xff0c;配置尽量高一点。尽可能有上google的环境配置。 主要步骤 1. 克隆源码 armbian源码仓库 2. 配置apt源 更改/etc/apt/sources.list为国内源&#xff0c;比如我这里ubuntu主机配置清华源。 然后执行apt-get -y update && apt-get -y…

Unity 刚体其它一些常用方法和属性

Unity刚体除了AddForce、AddTorque、AddRelativeForce、AddForceAtPosition、AddExplosionForce、AddForceAtPosition方法&#xff0c;还有其它一些常见的方法和属性&#xff1a; &#xff08;1&#xff09;Rigidbody.MovePosition(Vector3 position) 该方法用于移动刚体到某…

Netty Review - ByteBuf 读写索引 详解

文章目录 概念Pre概述ByteBuf简介ByteBuf的主要特性结构APIByteBuf的创建读写操作示例引用计数操作其他常用操作 Code 演示 概念 Pre Netty Review - 探索ByteBuf的内部机制 概述 Netty的ByteBuf是一个强大的字节容器&#xff0c;用于处理字节数据。它提供了比Java标准库中的…

DAY11

问题一&#xff1a;指针与引用的区别 疑问 为什么引用的本质是指针常量&#xff0c;但是对它求sizeof却是变量所占内存空间的大小那&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 1.引用是给变…

llvm后端之DAG设计

llvm后端之DAG设计 引言1 核心类设计2 类型系统2.1 MVT::SimpleValueType2.2 MVT2.3 EVT 3 节点类型 引言 llvm后端将中端的IR转为有向无环图&#xff0c;即DAG。如下图&#xff1a; 图中黑色箭头为数据依赖&#xff1b;蓝色线和红色线为控制依赖。蓝色表示指令序列化时两个节…

【教3妹学编程-算法题】循环移位后的矩阵相似检查

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&…

干货!什么是财务业务化和业务财务化?

此回答摘录自《自价值财务&#xff1a;以业务与财务的双向奔赴&#xff0c;成就合规与增长双赢》&#xff0c;原文近7000字&#xff0c;作者纷享销客CFO郭保彬先生。更多业财一体化内容详见纷享销客最新专刊《上市公司如何打好合规与增长双赢之战》。 如今&#xff0c;财务管理…

Linux系统配置与服务管理基础(二)

目录 一、通配符 1. 简介 2. 作用 3. 符号与效果 4. 示例 二、别名alias 1. 语法选项 2. 示例 3. 补充说明 三、查看磁盘使用量 1. 语法选项 2. ll与du区别 3. 补充 四、创建目录mkdir 1. 语法选项 2. 示例 四、建立空文件touch 1. 语法选项 2. 附加功能 3…

【Kotlin】基础变量、集合和安全操作符

文章目录 数字字面常量显式转换数值类型转换背后 位运算符字符串字符串模板修饰符数组集合&#xff08;Kotlin自带&#xff09;通过序列提高效率惰性求值序列的操作方式中间操作末端操作 可null类型安全调用操作符 ?.操作符 ?:非空断言操作符 !! 使用类型检测及自动类型转换安…

第二百一十七回 修改页面导航中遇到的问题

文章目录 1. 问题介绍2. 使用方法3. 代码与分析3.1 示例代码3.2 代码分析4. 内容总结我们在上一章回中介绍了"分享一种更新页面数据的方法"相关的内容,本章回中将介绍修改页面导航中遇到的问题.闲话休提,让我们一起Talk Flutter吧。 1. 问题介绍 我们在页面之间导…