Android 应用程序构成
一般情况Android应用程序是由以下四种组件构造而成的:
- Activity
- Broadcast Intent Receiver
- Service
- Content Provider
需要注意的是,并不是每个Andorid应用程序都必须构建这4个组件,有些可能由这4个组件的组合而成。
一旦你确定了你的应用程序中需要的组件,那么你就应该在AndroidManifest.xml中列出他们。 这是一个XML配置文件,它用于定义应用程序中需要的组件、组件的功能及必要条件等。这个文件是必须的。 详情参见Android manifest file documentation
四种组件说明如下:
Activity
Activity是最基本的Andorid应用程序组件,应用程序中,一个activity就是一个单独的屏幕。每一个activity都被实现为一个独立的类,并且从Activity基类中继承而来, activity类将会显示由Views控件组成的用户接,并对事件做出响应。 大多数的应用是由多屏幕显示组成。例如,一个文本信息的应用也许有一个显示发送消息的联系人列表屏幕, 第二个屏幕用来写文本消息和选择收件人, 再来一个屏幕查看消息历史或者消息设置操作等。这里每一个这样的屏幕就是一个activity,很容易实现从一个屏幕到一个新的屏幕并且完成新的activity。 在某些情况下当前的屏幕也许需要向上一个屏幕动提供返回值–比如让用户从手机中挑选一张照片返回通讯录做为电话拨入者的头像。
当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态并且压入历史堆栈中。用户可以通过回退操回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,因为Android会把每个应用的开始到当前的每一个屏幕保存在堆栈中。
Intent 和 Intent Filters
调用Android专有类 Intent 进行构屏幕之间的切换。 Intent是描述应用想要做什么。Intent两最重要的部分是Intent结构数据的动作和动作对应的数据。 典型的动作类型有:MAIN(activity的门户)、VIEW、PICK、EDIT等。 而动作对应的数据则以URI的形式进行表示。 例如:要查看某一个人的联系方式,你需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。
与之有关系的一个类叫IntentFilter。 相对于intent是一个有效的做某事的请求,一个intent filter则用于描述一个activity(或者Intent Receiver,看下面)能够操作哪些intent。 一个activity如果要显示一个人的联系方式时,需要声明一个IntentFilter,这个IntentFilter要知道怎么去处理VIEW动作和表示一个人的URI。 IntentFilter需要在AndroidManifest.xml中定义。
通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity将会调用startActivity(myIntent)方法。 然后,系统会在所有安装的应用程序中定义的IntentFilter中查找,找到最匹配myIntent的Intent对应的activity。新的activity接收到myIntent的通知后,开始运行。 当startActivity方法被调用将触发解析myIntent的动作,这个机制提供了两个关键好处:
- Activities能够重复利用从其它组件中以Intent的形式产生的一个请求
- Activities可以在任何时候被一个具有相同IntentFilter的新的Activity取代
Broadcast Intent Receiver
你可以使用BroadcastReceiver来让你的应用对一个外部的事件做出响应。 比如:当电话呼入时,数据网络可用时,或者到了晚上时。BroadcastReceivers不能生成UI,它只能通过 NotificationManager 来通知用户这些可能算是有趣的事情发生了。BroadcastReceivers既可以实现在AndroidManifest.xml中注册, 也可以在运行时的代码中使用Context.registerReceiver()进行注册。 但这些有趣的事情发生时,你的应用不必对请求调用BroadcastReceivers,系统会在需要的时候启动你的应用,并在必要情况下触发BroadcastReceivers。 各种应用还可以通过使用Context.sendBroadcast() 将它们自己的intent broadcasts广播给其它应用程序。
Service
一个Service是具有一段较长生命周期且没有用户界面的程序。 比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。 然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。 在这个例子中,媒体播放器这个activity会使用Context.startService() 来启动一个service,从而可以在后台保持音乐的播放。 同时,系统也将保持这个service一直执行,直到这个service运行结束。(你可以通过阅读Life Cycle of an Android Application 获取更多关于services的介绍). 另外,我们还可以通过使用Context.bindService() 方法,连接到一个service上(如果这个service还没有运行将启动它)。 当连接到一个service之后,我们还可以service提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。
Content Provider
应用程序能够将它们的数据保存到文件中、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,Content Provider将会很有用。一个Content Provider类实现了一组标准的方法,从而能够让其它的应用保存或读取此Content Provider处理的各种数据类型。 更详细的Content Provider资料,可以参考附带文档中的Accessing Content Providers。
更详细的Content Provider资料,可以参考附带文档中的 Accessing Content Providers。
