Android应用程序的五大基本组件

Android 个层次间调用关系 上一篇介绍了Android系统的启动过程,这里将介绍Android应用程序是如何按照层次关系来调用最底层的硬件和服务的, 在Android中运行的应用程序都是通过以下三种方式层层深入的: App---->runtimeservice ---> lib App--->runtimeservice --->native service ---->lib App--->runtimeservic 阅读详情
 
2010-06-06 14:34 483人阅读 评论(0) 收藏 举报

5 Basic Components

1.          Activity

2.          Service

3.          Broadcast Receiver

4.          Content Provider

5.          Intent

 

Activity —— 应用表示层( 基类 Activity )

       应用程序中的每个屏幕都是通过继承和扩展基类 Activity 来实现的。

       同一应用中的每个 Activity 是相互独立的。程序启动后显示的第一幅画面是应用程序的第一个 Activity (默认窗口),而后可以根据需要从这个 Activity 启动另一个新的 Activity 。

       Activity 利用 View 来实现应用中的 GUI (用户直接通过 GUI 和应用程序做交互)。 Activity 窗口内的可见内容通过基类 View 提供。使用 Activity.setContentView() 方法设置当前 Activity 中的 View 对象。

l          每个 View 对象控制着窗口内的一个矩形空间;

l          View 是一种层次化结构, Parent View 中的布局属性会被子 View 继承;

l          位于 View 层次关系最底层的子 View 对象所代表的矩形空间就是跟用户进行交互的地方

 

Activity 状态回调:

l          onCreate

l          onStart

l          onRestart

l          onResume

l          onPause

l          onStop

l          onDestroy

 

Service —— 没有可见的用户界面,但能够长时间运行于后台( 基类 Service )

       运行于应用程序进程的主线程中,因此 Service 不会阻塞其他组件和用户界面。

       Service 是不能自己启动的,必须通过 Context 对象(如一个 Activity )调用 startService 或 bindService 方法来启动(用这两种方法启动的 Service 的生命周期不同)。

1.          调用 startService 方法

a)          若 Service 没有启动,则首先会调用该 Service 的 onCreate 方法,然后再调用 onStart 方法。

b)         若 Service 已经启动,则会直接调用 onStart 方法

c)         该方法启动的 Service ,可以通过 Context 对象调用 stopService 来关闭,也可以通过 Service 自身调用 stopSelf() 或 stopSelfResult() 来关闭,关闭之前调用 onDestory 方法。

2.          调用 bindService 方法,使当前 Context 对象通过一个 ServiceConnection 的对象绑定到所指定的 Service

a)          若 Service 没有启动,则首先会调用该 Service 的 onCreate 方法初始化启动,然后调用 Service 的 onBind 方法初始化绑定。

b)         如果绑定 Service 的 Context 对象被销毁时,被绑定的 Service 也会调用 onUnbind 和 onDestroy 方法停止运行

c)         注意: BroadcastReceiver 是不能绑定服务的。

d)         一个绑定 Service 的 Context 对象还可以通过 unbindService() 来取消对服务的绑定。

e)          取消时, Service 会调用 unbind 方法,若 Service 是通过 bindService 来启动的,还会调用 onDestroy 方法来停止服务。

       Service 状态回调:

l          onCreate

l          onStart

l          onBind

l          onRebind

l          onUnbind

l          onDestroy

 

Broadcast Receiver —— 用户接收广播通知的组件( 基类 BroadcastReceiver)

       Android 中的广播要么来自于系统,要么来自普通应用程序。

很多事件都可能导致系统广播,如手机所在时区发生变化,电池电量低,用户改变系统语言设置等。

来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。

       为了响应不同的事件通知,应用程序可以注册不同的 Broadcast Receiver 。所有的 Broadcast Receiver 都继承自基类 BroadcastReceiver 。

       BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动 Activity 作为响应,或者通过 NotificationMananger 提醒用户。

       BroadcastReceiver 是对发送出来的 Broadcast 进行过滤接收并响应的一类组件。

 

       发送 Broadcast 信息

1.          把要发送的信息和用于过滤得信息 ( 如 Action 、 Category) 装入一个 Intent 对象

2.          调用 Context. sendBroadcast()、 sendOrderBroadcast() 、 sendStickyBroadcast() 方法,广播该 Intent 对象

3.          使用 sendBroadcast() 或 sendStickyBroadcast() 方法发出去的 Intent ,所有满足条件的 BroadcastReceiver 都会随机地执行其 onReceive() 方法;

4.          而 sendOrderBroadcast() 发出去的 Intent ,会根据 BroadcastReceiver 注册时 IntentFilter 设置的优先级的顺序来执行,相同优先级的 BroadcastReceiver 则是随机执行

5.          sendStickyBroadcast() 方法主要的不同是, Intent 在发送后一直存在,并且在以后调用 registerReceiver() 注册相匹配的 Intent 时会把这个 Intent 直接返回。

6.          若在使用 sendBroadcast() 方法时指定了接收的权限,这只有在 AndroidManifest.xml 中用 <uses-permission> 标签声明了拥有此权限的 BroadcastReceiver 才会有可能接收到发送来 Broadcast 。

7.          若在注册 BroadcastReciever 时,指定了可接收的 Broadcast 的权限,则只有在包内的 AndroidManifest.xml 中用 <uses-permission> 标签声明了,拥有此权限的 Context 对象所发送的 Broadcast 才有可能被这个 BroadcastReceiver 所接收。

接收 Broadcast 消息

1.          继承 BroadcastReceiver 类,并实现 onReceive 方法

2.          注册 Broadcast Receiver (有 2 种方法:一种方法是,静态地在 AndroidManifest.xml 中用 <receiver> 标签声明,并在标签内用 <intent-filter> 标签设置过滤器; 另一种方法,动态地在代码中先定义并设置好一个 IntentFilter 对象,然后再需要注册的地方调用 Context.registerReceiver() 方法) (取消注册时,调用 Context.unregisterReceiver() 方法)

 

Content Provider —— 为解决应用程序间数据通信、共享的问题( 基类 ContentProvider)

       在 Android 中,每个应用程序都是用自己的用户 ID 并在自己的进程中运行。这样的好处是,可以有效地保护系统及应用程序,避免被其他不正常德应用程序所影响,每个进程都拥有独立的进程地址空间和虚拟空间。

       Content Provider 可以将应用程序特定的数据提供给另一个应用程序使用。其数据存储方式可以是 Android 文件系统、 SQLite 数据库或者其他合理的方式。

       当数据需要在应用程序间共享时,我们就可以利用 ContentProvider 为数据定义一个 URI 。之后,其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个 ContentResolver, 然后传入响应的 URI 就可以了。

       Content Provider 继承自基类 ContentProvider ,并且实现了一组标准接口。通过这组接口,其他应用程序能对数据进行读写和存储。然而,需要使用数据的应用程序并不是直接调用这组方法,而是通过调用ContentResolver 对象的方法来完成。 ContentResolver 对象可以与任意 ContentProvider 通信。

       要为当前应用程序的私有数据定义 URI ,就需要专门定义一个继承自 ContentProvider 的类,然后根据不同的操作调用的方法去实现这些方法的功能。

       ContentResolver 类为应用程序提供了接入 Content 机制的方法。要构造一个 ContentResolver 对象可以为构造方法 ContentResolver(Context context) 传入一个 Context 对象,也可以直接通过 Context 对象调用 getContentResolver() 方法获得 —— 有的 ContentResolver 对象后,就可以通过调用其 query() 、 insert() 、 update() 等方法来对数据进行操作了。

 

一旦需要以上 4 种 Android 应用程序基本组件完成请求, Android 会首先确认该组件所在进程是否运行,如果没有运行, Android 将先启动进程,同时确认被请求组件的实例是否存在,否则将创建一个新的组件实例。

 

Intent —— 连接组件的纽带

       以上 4 种基本组件中,除了 Content Provider 是通过 Content Resolver 激活外,其他 3 种组件 Activity 、 Service 和 Broadcast Receiver 都是由 Intent 异步消息激活的。

       Intent 在不同的组件之间传递消息,将一个组件的请求意图传给另一个组件。因此, Intent 是包含具体请求信息的对象。

针对不同的组件, Intent 所包含的消息内容有所不同,且不同组件的激活方式也不同, 且不同类型组件有传递 Intent 的不同方式。

       Intent 是一种运行时绑定( runtime binding )机制,它能够在程序运行的过程中连接两个不同的组件。通过 Intent ,你的程序可以向 Android 表到某种请求或者意愿, Android 会根据意愿的内容选择适当的组件来处理请求。

l          激活一个新的 Activity ,或者让一个现有的 Activity 执行一个新的操作,可以通过调用如下两种方法 ( 这两汇总方法需要传入的 Intent 参数称为 Activity Action Intent) :

1.          Context.startActivity()

2.          Activity.startActivityForResult()

l          启动一个新的服务,或者向一个已有的服务传递新的指令,可以调用如下两种方法:

1.          Context.startService()

2.          Context.bindService()

l          发送广播 Intent( 所有已注册的拥有与之相匹配 IntenFilter 的 BroadcastReceiv 就会被激活 ) ,可以调用如下三种方法:

1.          Context.sendBroadcast()

2.          Context.sendOrderBroadcast()

3.          Context.sendStickBroadcast()

Intent 一旦发出, Android 都会准确找到相匹配的一个或多个 Activity 、 Service 或 BroadcastReceiver 作响应。所以,不同类型的 Intent 消息不会出现重叠, BroadcastIntent 消息只会发送给 BroadcastReceiver ,而绝不可能发送给 Activity 或 Server 。有 startActivity() 传递的消息也只可能发送给 Activity ,由 startService() 传递的 Intent 只可能发送给 Service 。

 

       Intent 对象抽象地描述了执行操作, Intent 的主要组成部分;

1.          目标组件名称。 [ 可选项 ]

a)          组件名称是一个 ComponentName 对象,是目标组件类名和目标组件所在应用程序包的组合

b)         组件中的包名不一定要和 manifes 文件中包名完全匹配

c)         如果 Intent 消息中指明了目标组件的名称,这就是一个显示消息, Intent 会传递给指明的组件。

d)         如果目标组件名称并没有指定, Android 则通过 Intent 内的其他信息和已注册的 IntentFilter 的比较来选择合适的目标组件

2.          Action [ 隐式比较 ]

a)          描述 Intent 所触发动作的名字字符串。

b)         理论上 Action 可以为任何字符串,而与 Android 系统应用有关的 Action 字符串以静态字符串常量的形式定义在了 Intent 类中。

3.          Data [ 隐式比较 ]

a)          描述 Intent 要操作的的数据的 URI 和数据类型。

b)         正确设置 Intent 的数据对于 Android 寻找系统中匹配 Intent 请求的组件很重要。

4.          Category [ 隐式比较 ]

a)          是对被请求组件的额外描述信息。

b)         Android 也在 Intent 类中定义了一组静态字符串常量表示 Intent 不同的类别。

5.          Extra

a)          当我们使用 Intent 连接不同组件时,有时需要在 Intent 中附加额外的信息,以便将数据传递给目标 Activity 。

b)         Extra 用键值对结构保存在 Intent 对象当中, Intent 对象通过调用方法 putExtras() 和 getExtras() 来存储和获取 Extra

c)         Extra 是以 Bundle 对象的形式来保存的, Bundle 对象提供了一系列 put 和 get 方法来设置、提取相应键值信息。

d)         在 Intent 类中同样为 Android 系统应用的一些 Extra 的键值定义了静态字符串常量。

6.          Flag

 

决定 Intent 目标组件的因素:

n          在显式 Intent 消息中,决定目标组件的唯一要素就是组件名称(不用再定义其他 Intent 内容)

n          而隐式 Intent 消息中,由于没有目标组件名称,所以必须由 Android 系统帮助应用程序寻找与 Intent 请求意图最匹配的组件。

n          隐式 Intent 消息中目标组件具体选择方法是: android 将 Intent 的请求内容和一个叫做 IntentFilter 的过滤器比较, IntentFilter 中包含系统中所有可能的待选组件。如果 IntentFilter 中某一个组件匹配隐式 Intent 请求内容,那么 Android 就选择该组件作为该隐式 Intent 的目标组件。

 

IntenFilter

       应用程序的组件为了告诉 Android 自己能响应、处理哪些隐式 Intent 请求,可以声明一个甚至多个 IntentFilter 。

       每个 IntentFilter 描述该组件所能响应 Intent 请求的能力 —— 组件希望接收什么类型的请求行为,什么类型的请求数据。

       隐式 Intent 和 IntentFilter 进行比较时的三要素: Action 、 Data 、 Category 。

       一个隐式 Intent 请求要能够传递给目标组件,必需通过以上三个方面的检查。如果任何一方面不匹配, Android 都不会将该隐式 Intent 传递给目标组件。

       <intent-filter>

              <action android:name=””/>

              <category android:name=””/>

              <data android:type=”” android:scheme=”” android:authority=”” android:path=””/>

       </intent-filter>

1.          动作测试

a)          一条 <intent-filter> 中至少应该包含一个 <action>, 否则任何 Intent 请求都不能和该 <intent-filter> 匹配。

b)         如果 IntentFilter 中没有包含任何 Actino 类型,那么无论什么 Intent 请求都无法和这条 IntentFilter 匹配。

c)         如果 Intent 请求中没有设定 Action 类型,那么只要 IntentFilter 中包含有 Action 类型,这个 Intent 请求将顺利通过 IntentFilter 的测试。

2.          类别测试

a)          只有当 Intent 请求中所有的 Category 与组件中的某一个 IntentFilter 的 category 完全匹配,才会让该 Intent 请求通过测试, IntentFilter 中的多余 category 声明并不会导致匹配失败。

b)         一个没有指定任何类别的 IntentFilter 仅仅只会匹配没有设置类别的 Intent 请求。

3.          数据测试

a)          <data> 元素指定了希望接受的 Intent 请求的数据 URI 和数据类型: URI 被分成三部分类进行匹配, scheme 、 authority 和 path.

b)         使用 setData 设定的 Intent 请求的 URI 数据类型和 scheme ,必须与 IntentFilter 中指定的一致

若 IntentFilter 中还指定了 authority 或 path ,他们也需要相匹配才会通过测试。

android应用程序的五大基本组件 立即下载

相关推荐

训练AI:从数据收集到模型部署的完整指南

如果你刚开始接触AI,建议先学习一些基础的编程和机器学习知识,还可以使用现成的AI平台和工具来帮助你训练AI模型。在这篇文章中,我们将详细探讨从数据收集到模型部署的完整步骤,并提供一些有用的技巧和工具,以帮助你成功地训练自己的AI模型。在收集数据时,你需要从可靠的数据源(如数据仓库、数据集市、API接口)获取数据,确保数据的准确性和完整性。常用的划分比例是70%的数据集用于训练模型、15%的数据集用于验证模型,5%的数据集用于超参数调整,最后10%的数据集用于测试模型的性能。测试数据集用于测试模型的性能。

a_wsnd的博客 4165

Android Activity/window/View的关系

Activity管理window,window管理view

zenmela2011的专栏 823

在 Linux/Debian/Ubuntu 上使用 Brasero 刻录光盘

在 Ubuntu 系统中,Brasero 是一个非常方便的光盘刻录工具。无论是创建数据光盘、音频光盘还是刻录光盘镜像文件,Brasero 都能轻松胜任。本文将介绍如何在 Ubuntu 上安装和使用 Brasero 进行光盘刻录。

I AM COMING BACK... 3542

Android组件化架构解析总结

前面说到,组件化的核心就是解耦,所以组件和组件之间是不能有依赖的,例如在首页模块点击购物车按钮需要跳转到购物车模块的购物车页面,两个模块之间没有依赖,所以不能在使用Activity的显示跳转来跳转页面了 ,虽然隐式启动是可以实现跳转的,但是隐式 Intent 需要通过 AndroidManifest 配置和管理,协作开发显得比较麻烦。建议创建一个lib_core的公共功能模块组件,将常用的与业务无关的功能封装到此模块中,例如图片加载功能,网络请求功能,日志管理功能等,这些功能可以被所有的app通用。

XBlithe的博客 2206

OpenCV 常用的API总结(迅速查询)

OpenCV基本操作 openCV安装 读取图片(IO操作) 绘制集合图形 图像加法以及混合操作 OpenCV图像处理 图像几何变换 形态学操作 图像平滑 直方图 边缘检测 模板匹配 傅里叶变换 轮廓检测 图像分割 图像特征提取 SIFT检测关键点 视频读写............

Peyzhang的博客 3934

INS/伪距组合导航(2)

伪距惯导组合导航

u014430081的博客 827

android中Activity、View、Window的理解

1.View:最基本的UI组件,表示屏幕上的一个矩形区域。 2.Window: 表示一个窗口,不一定有屏幕那么大,可以很大也可以很小; 它包含一个View tree和窗口的layout 参数。 View tree的root View可以通过getDecorView得到。还可以设置Window的Content View 3.Activity:Activity包含一个Window,该Windo

wxy931028的博客 313

点云工具CloudCompare下载、安装与汉化

打开软件后,是英文界面,找到菜单栏【Display】-【Language Translation】,选择简体中文。进入官网后,点击菜单栏【Download】提示需要重启软件才能生效,点OK即可。重启软件后,已经是中文了。选择合适系统进行下载。常规软件安装流程即可。

sagima_sdu的博客 1万+

Android应用知识--应用组件

知识 应用组件是 Android 应用的基本构建基块。每个组件都是一个不同的点,系统可以通过它进入您的应用。 并非所有组件都是用户的实际入口点,有些组件相互依赖,但每个组件都以独立实体形式存在,并发挥特定作用 — 每个组件都是唯一的构建基块,有助于定义应用的总体行为。 共有四种不同的应用组件类型。每种类型都服务于不同的目的,并且具有定义组件的创建和销毁方式的不同生命周期。 以下便是这四种应用

与望 1399

YOLO11涨点优化:训练技巧 | 使用标签平滑(Label Smoothing)配合余弦退火学习率,防止过拟合,稳步提点

摘要: YOLO11凭借动态卷积核调度、自适应特征融合等创新成为2026年目标检测主流,但面临训练集过拟合问题。文章聚焦两种零推理开销的正则化技巧:标签平滑(Label Smoothing)和余弦退火学习率(Cosine Annealing LR)。标签平滑通过软化硬标签(如将[1,0]改为[0.9,0.1])防止模型过度自信,代码中通过label_smoothing=0.1一键启用;余弦退火则以平滑的余弦曲线调整学习率(cos_lr=True),避免阶梯衰减的震荡。两者组合可显著缩小YOLO11训练与验证

2601_95807009的博客 45

【PX4学习笔记】3. PX4 固件烧写(1 探索过程)

飞控型号:cube orange【PX4官方用户指南中关于cube orange的描述】 飞控载板型号:Mini Carrier Board【迷你载板说明文档】 固件安装参考:The Cube User Manual V1.0

【人工智障 | 计算鸡视觉 | 机器孩】 7675

初识Android应用程序的五大基本组件

<br />5 Basic Components<br />1.         Activity<br />2.         Service<br />3.         Broadcast Receiver<br />4.         Content Provider<br />5.         Intent<br /> <br />Activity ——应用表示层(基类Activity)<br />       应用程序中的每个屏幕都是通过继承和扩展基类Activity来实现的。<br

guopeixin的专栏 2754

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

五大基本组件

Android的五大基本组件 Android的基本组件  1.Activity  Activity 是最基本的模块,一般称之为“活动”,在应用程序中一般一个Activity就是一个单独的屏幕。每一个活动都被实现为一个独立的类,并且从活动基类中继 承而来,活动类将会显示由视图控件组成的用户接口,并对事件作出响应。Activity利用View来实现应用中的GUI(用户直接通过

Barving的专栏 984

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android五大基本组件,写给正在求职的安卓开发

1.Activity Activity 是最基本的模块,一般称之为“活动”,在应用程序中一般一个Activity就是一个单独的屏幕。每一个活动都被实现为一个独立的类,并且从活动基类中继 承而来,活动类将会显示由视图控件组成的用户接口,并对事件作出响应。Activity利用View来实现应用中的GUI(用户直接通过GUI和应用程序 做交互)。Activity窗口内的可见内容通过基类View提供。使用Activity.setContentView()方法设置当前 Activity中的View对象。 每个View

m0_66155658的博客 1307

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Android应用程序开发的五大概念

android的入门,要掌握五大组件:Activity,Service,Content Provider, Broadcast Receiver,Intent   android应用程序基本特性:apk:android的安装程序des:android运行的二进制文件每一个应用程序对应一个进程,每个进程有自己的虚拟机,所以每个应用程序是相对独立的每个应用程序有一个系统分配的userid,也可以让...

zhenyaoMilenfan的专栏 253

Android学习06Android应用程序的基本组件

一个Android应用程序可以由几个不同的组件构成,Android应用程序的基本组件包括:Activity,Service,BroadcastReceiver,ContentProvider和Intent. 不同的组件有不同的特性以及各自的生命周期,下面分别介绍: 1.Activity组件 Activity是最常见的一种Android组件,每个Activity都...

weixin_30312563的博客 102
上一篇: 20111123这一年就这样了
下一篇: 20111125android面试
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值