Android官网学习笔记003:应用程序基本原理(02)

###################  声明部分  #####################

主要内容与来源:Google官网www.android.com

本人博客地址:http://blog.csdn.net/riverzhu

声明:由于本文档为阅读Google官网www.android.com的Dev. Guide内容,并结合个人理解与总结所形成的。因此,很多内容均受个人能力与水平限制,难免存在着各种不足与错误,希望各位朋友多多指出。同时,欢迎各位朋友在转载时保留“声明部分”。此外,英文中很多词汇直接译成中文将会引起误解,如Started Service、Bound Service等,均直接引用,而不作翻译。

联系方式:dr.river.zhu@gmail.com

################################################

 

应用程序组件

应用程序组件是Android应用程序的基本构建模块(Building Blocks)。每个组件均是系统可以进入应用程序的不同入口点。并不是所有组件均是用户的真实入口点(Entry Points),而且一些组件彼此相互依赖,但每个组件以其自身实体的形式而存在,并扮演着特定角色——每个组件均是用于辅助定义应用程序全部行为的独特的构建模块。

共有四种不同类型的应用程序组件。每种类型用于截然不同的目的,并且具有截然不同的生命周期。生命周期定义了组件如何创建及销毁。

四种类型的应用程序组件如下:

  • Activity(活动)
一个Activity相当于具有用户界面的单屏显示(Single Screen)。例如,一个电子邮件应用程序可能拥有一个用于显示新邮件列表的Activity,一个用于撰写邮件的Activity,及一个阅读邮件的Activity。在电子邮件应用程序中,虽然这些Activity协同工作,进而提供一个有粘着力的用户体验,但每个组件彼此独立。就此而言,不同的应用程序可以启动这些组件中的任意一个(在电子邮件应用程序允许的情况下)。例如,用户为了分享拍摄的照片,一个摄像机应用程序可以启动电子邮件应用程序中用于撰写邮件的Activity。

每个Activity均是Activity类的子类,更多信息请参阅“Activity开发指南”

  • Services(服务)
一个Service是一个运行于后台,执行长期运行任务或为远程进程完成工作的组件。Service并不提供用户界面。例如,一个Service可能在后台播放音乐,同时用户在使用另一个应用程序;一个Service可能在不阻塞用户与其他Activity交互的情况下通过网络获取数据。其他组件,如Activity,可以启动一个Service,并使该Service运行,也可以为了与该Service进行交互操作而绑定(Bind)该Service。
每个Service均是Service类的子类,更多信息请参阅“Service开发指南”。
  • Content Provider(内容提供器)
一个Content Provider管理一组共享的应用程序数据。可以存放数据到文件系统、SQLite数据库、网络或任何应用程序可访问的其他持久性存储地点。通过Content Provider,其他应用程序可以查询甚至修改数据(在Content Provider允许的情况下)。例如,Android系统提供了一个用于管理用户通讯录信息的Content Provider。如此一来,具有适当权限的任何应用程序均可以查询该Content Provider的部分信息(如ContactsContract.Data)进而读取或写入特定人员的相关信息。
Content Provider对于读取和写入应用程序的非共享私有数据来说同样有用。例如,Note Pad示例应用程序使用了一个Content Provider用于存放记录。
每个Content Provider均是ContentProvider类的子类,并且必须实现一组标准的API,这些API将允许其他应用程序执行事务处理(Transactions)。更多信息请参阅“Content Provider开发指南”。
  • Broadcast Receiver(广播接收器)
broadcast receiver是一个用于对系统范围内的广播公告(Broadcast Announcements)进行响应的组件。许多广播由系统产生,如屏幕关闭、电量不足、图像捕捉等广播公告。应用程序也可以产生广播公告,例如,让其他应用程序获知数据已经下载至本地设备,处于可用状态。虽然Broadcast Receiver不显示用户界面,但他们可以创建一个状态栏通知(Status Bar Notification),进而在广播事件发生时提醒用户。但是,绝大部分情况下,对于其他组件而言,Broadcast Receiver仅仅是一个“网关”(“Gateway”),并且仅处理最低限度的工作。例如,Broadcast Receiver可能根据收到的具体事件初始化一个Service,并完成一些操作。

Broadcast Receiver是BroadcastReceiver类的子类,而每个广播均以Intent对象(意图)的形式提交的。更多信息请参阅“BroadcastReceiver类”。

Android系统的独特设计之一在于任何应用程序均可以启动另一个应用程序的组件。例如,如果希望用户使用设备的摄像头拍摄照片,很可能已有其他应用程序实现了此功能(以组件的形式),此时该应用程序就可使用这个功能(组件),而不是开发者自己再开发出另一个拍摄照片的activity。开发者不需要合并甚至链接照相机应用程序的代码。相反,开发者仅需启动具有拍摄照片功能的照相机程序里的Activity即可。当拍摄结束后,照片甚至可以被回送至应用程序,以方便进一步处理。对于用户而言,看起来摄像头就是这个应用程序的一部分。

当系统启动一个组件时,就为所属应用程序启动了相应的进程(若该程序尚未运行),同时也为该组件初始化所需的类。例如,若应用程序启动了照相机应用程序中用于拍摄照片的Activity,则该activity运行于照相机应用程序所属的进程内,而不是该应用程序所对应的进程内。因此,跟其他操作系统不同,Android应用程序不存在着唯一的入口点(例如,没有main()方法)。

由于系统在具有文件访问权限的独立进程内运行每个应用程序,并对其他应用程序的文件访问严格控制,因此应用程序无法直接激活[Activate]另一个应用程序中的组件。然而,Android系统却可以。因此,为了激活另一个应用程序中的组件,必须向系统传递消息,说明启动特定组件的Intent(意图)。系统随后为该应用程序激活所需组件。
注:[Activate]在不同的上下文译为激活或启动。

 

激活组件

四种组件类型中的三种(Activity、Service、Broadcast Receiver)可以被称为意图(Intent)的异步消息激活。不论组件是否属于所开发的还是其他的应用程序,Intent均可以在运行时将不同个体组件彼此绑定(可以将Intent想象成其他组件请求执行特定动作的信使(Messenger))。

一个Intent由Intent对象创建,该对象定义了激活一个特定组件或一种特定类型组件的消息(组件可以显示(Explicit)或隐式(Implicit)指定)。

对于Activity和Service,一个Intent定义了执行的动作(如,“查看”或“发送”信息等),并可指定待操作的数据所在的URI(以及,组件激活时还需要知道其他信息)。例如,为了显示图像或打开网页,一个Intent可能为某Activity传递请求。在某些情况下,开发者可以激活一个Activity来接收处理结果,这时该Activity同样也以Intent对象的形式返回结果(例如,开发者可以发出一个Intent允许用户选择个人通讯信息,并将其返回。返回Intent包括指向被选择的联系信息的URI)。

对于Broadcast Receiver,Intent仅仅定义了被广播的公告(如,一个表明电量不足的广播仅包含“Battery is low”的已知动作字符串)。

其他组件类型,Content Provider,无法被Intent激活。恰恰相反,当被ContentResolver对象作为请求目标时,Content Provider将被激活。Content Resolver(内容解析器)处理Content Provider的所有直接事务,以便执行Content Provider事务的组件可调用ContentResolver对象方法来省去这些处理。这使得在Content Provider与(为了安全目的)请求信息的组件之间形成了一个抽象层。

激活每种类型的组件的可分别采用的方式:

  • 可向startActivity()或startActivityForResult()(当希望activity返回结果时使用)传递一个Intent对象来启动一个Activity(或安排该Activity处理新任务)
  • 可向startService()传递一个Intent对象来启动一个Service(或向某正运行的service指示新的指令)。也可以通过向bindService()传递一个Intent对象来绑定Service。
  • 可向诸如sendBroadcast()、sendOrderedBroadcast()或sendStickyBroadcast()之类的方法传递一个Intent对象来初始化一个广播(Broadcast)。
  • 可通过调用ContentResolver类的query()方法向Content Provider执行一个查询。

更多关于使用Intent的信息,请参阅“Intent与Intent滤器”文档。更多关于激活特定组件的信息,请参阅如下文档:Activity、Service、BroadcastReceiver及Content Providers。

——未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值