英语原文共 12 页,剩余内容已隐藏,支付完成后下载完整资料
Android应用的主要组件
前面已经讲述了编写健壮的Java代码所需的基础知识,本章将侧重于介绍Android平台开发中的主要概念。
Android平台和传统编程模型的对比
传统编程中,操作系统启动应用时使用唯一入口点,一般是main函数,在这个函数中可能会首先解析用户在命令行中提供的输入参数,然后获取输入数据,在处理之后生成输出数据。操作系统负责把程序的代码加载到进程中,然后开始执行它。从概念上讲,这个过程看起来如图3-1所示。
图3-1:在进程中运行的简单应用
使用Java编写程序,这个过程会变得稍微复杂一些:Java虚拟机(VM)负责将二进制代码加载到内存中来实例化Java类。这个过程如图3-2所示。如果使用的是富图形化用户界面系统,如Swing,则可能会启动一个UI系统,在UI系统中通常需要编写回调函数来响应各种操作事件。
图3-2:一个运行在Java虚拟机上的一个进程中的Java应用
相比而言,Android则更进一步,它支持多个应用入口点,引入了更丰富的机制。在 Android系统中假定的前提是,系统会在不同的地方启动它们,这取决于用户当前正在哪里以及用户接下来想做的是什么。除了位置上的分层,程序近似于一组组件之间的协作,它可能在应用的正常流之外启动。例如,一个对条形码进行扫描的组件提供了这个独立的功能,很多应用可以把它组合到自己的UI流中。用户不需要亲自动手启动每个应用,组件本身就能够调用某个程序与用户交互。
活动、意图和任务
Android活动既是用户交互单元(通常填满Android移动设备的整个屏幕)也是执行单元。开发交互式的Android程序时,首先要继承Activity类。活动提供了在Android应用中可重用、可交换的UI组件流。
那么,一个活动如何调用另一个活动,如何将信息传递给第二个活动呢?不同活动之间的基本通信单元是Intent类。Intent类是一个抽象的功能描述,用来定义一个活动要求另一个活动执行的功能,类似于是第二个活动提供的功能的一张照片。Intent类是构建松散耦合的系统的基础,它支持一个活动启动另一个活动。应用发布Intent时,可能已经有几个不同的已注册的活动都能实现这个功能。在本书第1章中为验证Android SDK是否正确安装而创建test应用的过程中,我们已经“编写”过了和活动相关的代码。下面再一起来看看这段代码:
public class TestActivity extends Activity {
/** Called when the activity is first created. */
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
}
}
当系统启动这个活动,它会首先调用Activity的子类TestActivity的构造函数,然后调用Activity的onCreate方法。这会加载并显示在main.xml文件中定义的视图结构(view hierarchy)。onCreate方法则开启了Activity的生命周期。
Activity类是Android系统中最重要的类之一,支持应用的模块化及功能共享。Activity 会和Android运行时交互,以实现应用生命周期的关键部分。每个活动可以使用类Context独立配置。
在绝大多数情况下,一个Android应用中的每个活动都是独立于其他的活动的。一个活动不会在代码中直接调用另一个活动的方法。Android框架中的另外一个元素(Intent)负责通信。因此,不建议引用活动对象。Android运行时环境负责创建并管理应用的活动及其他各种组件,回收它们所使用的内存,以确保每个任务占用的内存相对较少。你会发现专门对活动内存进行管理时,效率反而会非常低。
注意:和用object来表示类的实例很相似,我们使用活动来表示类Activity的实例。
在Android中的用户界面流控制,不是基于方法调用的。在其所采用的机制中,应用使用Intent描述清楚它想要的功能,系统负责找出一个匹配的实现。Android的Home桌面就是使用这些描述来启动应用的,每个应用也可以按照自己的意愿使用自己喜欢的意图来实现这种桌面功能。Android开发人员将这种结果流称为“任务”(task):跨越多个应用的一组活动,而且实际上是多个进程。图3-3显示了跨越三个应用并涉及了多个活动的一个任务(表3-1给出的例子)。组成该任务的活动链跨越了三个独立的进程和堆,它们可以相互独立存在,其他应用也可能会为同一个活动子类另外创建实例。
表3-1:一个简单的任务实例,由多个应用的活动组成
应用 |
活动 |
用户的下一步操作 |
|||
短信 |
消息列表视图 |
用户单击列表中的一条消息 |
|||
短信 |
查看一条短信 |
用户单击菜单→查看联系方式 |
|||
通讯录 |
查看一个联系方式 |
用户单击呼叫此号码 |
|||
电话 |
拨打通讯录中的这个手机号 |
图3-3:一个任务中跨越了多个应用的多个活动
其他Android组件
Android应用还有一些其他组件,具体包括:Service(服务)、Content Provider(内容提供者)和Broadcast Receiver(广播接收器)。类Service负责为后台功能提供支持,类 ContentProvider是多个应用使用数据存储的访问方式,Broadcast Receiver支持多方接收应用所广播的意图信息。
你可能会发现和组件相比,应用本身是一个相对不重要的单元。设计良好的应用会和Android环境“融为一体”,这些应用可以启动其他应用的活动,使用它们的功能,通过Android支持组件来提供或增强自身的功能。可以把Android的内容提供者和意图理解成辅助性API,应该学会使用它们,以便能够充分利用Android强大的特性并实现和Android平台的无缝集成。
Service
Android的Service类负责为后台执行的任务提供支持,这些任务可能在运行,但是在屏幕上看不到。播放音乐的应用有可能实现成服务,以便在用户查看网页时也能够播放音乐。通过Service,应用可以通过长连接来共享一些功能。这种方式在类似FTP和HTTP 这样的Internet服务中是无处不在的,这些服务会一直等待直到客户端的请求触发它们。Android平台不会回收服务的资源,所以一旦某个服务启动了,就很可能可以随时访问该服务,除非内存耗尽了。
和Activity类似,Service类提供了控制其生命周期的方法,如停止和重新启动该服务。
内容提供者
内容提供者组件和RESTful Web服务非常类似,这些组件也是使用URL,而且内容提供者子类的操作和RESTful Web操作也很相似,例如发布和获取数据。在内容提供者组件中的URI通常是以标识符content://开头,本地设备可以识别该标识符,使我们能够访问内容提供者数据。要使用类内容提供者,需要指定一个URI及将如何操作引用的数据。以下是内容提供者支持的操作列表,它提供了大家熟悉的四种基本的数据操作:创建(插入)、读取(查询)、更新和删除。
Insert(插入)
类ContentProvider提供的insert方法和REST POST操作类似,作用就是在数据库中插入新的记录。
Query(查询)
类ContentProvider提供的query方法和REST GET操作类似,它返回一组记录,这些记录保存在一个特殊的集合类Cursor中。
Update(更新)
ContentProvider提供的update方法和REST UPDATE操作类似,它用新的记录更新数据库中的老记录。
Delete(删除)
类ContentProvider提供的delete方法和REST DELETE操作类似,它删除数据库中与之匹配的记录。
注意:REST是“表现层状态转换”(Representational State Transfer)的简称。它没有HTTP协议那么正式,它更多的是一种使用HTTP作为简单的访问基础的概念框架。虽然REST的实现可能有区别,但它们都力争简单。Android的内容提供者API把类似于REST的操作作为API 正式提供,其设计就是遵循REST的简单性原则。可以在Wikipedia上得到更多关于REST的信息:http://en.wikipedia.org/wiki/REST。
内容提供者组件是Android内容模型的核心:通过ContentProvider类,应用可以和其他应用共享数据,并管理应用的数据模型。和ContentProvider类密切相关的类 ContentResolver,这个类帮助Android系统中的其他组件找到内容提供者。你会发现整个平台有很多内容提供者,它们可以同时用于操作系统和普通应用。值得一提的是,Android应用的核心正是利用内容提供者为新的Android应用提供快速、复杂的功能,包括提供浏览器(Browser)、日历(Calendar)、联系方式(Contacts)、呼叫日志(Call Log)、多媒体(Media)和设置(Settings)等。内容提供者在进程间通信(InterProcess Communication ,IPC)中是独有的。其不同于在其他平台上构建的一些方式,如CORBA、RMI和DCOM,这些平台重点在于远程过程调用。内容提供者身兼两职,既是持久性机制,同时还负责进程间的通信。除了支持进程间的方法调用外,内容提供者还使得开发人员可以在不同的进程之间高效地共享整个SQL数据库。除了对象分享,内容提供者还管理着所有的SQL表。
内容提供者的使用
考虑到内容提供者在Android中的重要性,这里编写了一个使用内容提供者的简单客户端来介绍它。在这个例子中,使用了最重要的内容提供者之一—— Contact数据库,其应该有助于你去了解在应用开发中使用内容提供者的基本方式。类ContentProvider提供了核心的内容提供者API,可以以此为基础创建一些子类来管理特定类型的数据。Activity 使用类ContentResolver及其关联的URL来访问特定的内容提供者实例,如下所示:
// code from an activity method
ContentProviderClient client=getContentResolver().
acquireContentProviderClient('content://contacts/people');
ContentProvider provider = client.getLocalContentProvider();
要使用内容提供者,需要调用按照REST风格定义URI的数据操作,这些操作是在类UriMatcher中定义的。类UriMatcher提供了基于REST的URL的简单字符串匹配工具,它支持字符串通配符。内容提供者的URL的形式往往如下所示:
content://authority/path/id
其中,authority是Java包内容提供者命名空间(通常就是内容提供者的Java命名空间)。以下是一些内容提供者URI示例:
// references a person
content://contacts/people/25
// this URI designates the phone numbers of the person whose ID is'25' content://contacts/people/25/phones
当开发人员调用内容提供者的query方法时,会返回一个Cursor对象,它实现了android. database.Cursor接口对象。通过该接口,可以使用索引每次检索一条结果(类似于数据库中的一条记录),在检索每一条结果时,索引会自动更新。熟悉JDBC的开发人员可以把android.database.Cursor理解成java.sql.ResultSet。在绝大多数情况下, Cursor对象表示的是在SQLite表上的查询结果。开发人员可以使用底层SQLite表来访问 cursor的各个字段。下面这个
全文共11879字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[143022],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。