注:本系列文章原文内容来自http://code.google.com/android的介绍,每章之前会给出原始文章地址,主要为共享资源使用,欢迎教学用转载。用于商业用途请先联系作者。
Anatomy of an Android Application
原文:http://code.google.com/android/intro/anatomy.html
一个Android应用程序有四个组件:
Activity
Intent Receiver
Service
Content Provider
并非每一个应用程序都需要有所有的这四个组件,不过你的应用程序必须由其中的一个或者几个组成。
一旦你决定了你的应用程序需要其中的哪几部分,就要在AndroidManifest.xml文件中列出来。该文件是开发者宣告所用组件以及组件的功能和需求的,具体请参见相应文档http://code.google.com/android/devel/bblocks-manifest.html
Activity
Activity是Android程序四个组件中最常用的。一个Activity通常是你的应用程序中的一个单独的窗口,每个Activity都是有一个 Activity基类的扩展实现的。你的类由View组成,显示一个用户接口,并响应事件。大多数应用程序由多个窗口组成。比如,一个消息程序可能由下面几个窗口组成:一个显示联系人列表用以发送消息的窗口,另一个窗口负责写消息给指定的联系人,还有一个窗口用来浏览旧的消息或者修改设置。每一个这样的窗口都由一个Activity实现,从一个窗口移到另一个窗口通过启动一个新的Activity完成。在某些情况下,一个Activity可能给前面的 Activity返回一个值――比如一个让用户选择一个图片的Activity就要返回选择的图片给调用它的Activity。
当一个新窗口打开时,前面的窗口毁暂停,并被放入历史堆栈中,用户可以回退到之前打开的窗口去。当不需要继续保留时,窗口也可以选择被从历史堆栈中删除。Android会为每个从Home窗口启动的应用程序维持历史堆栈。
Intent and Intent Filters
Android使用一个特殊的被称之为Intent的类来从一个窗口移动到另一个窗口,一个Intent描述了应用程序想做什么事情。Intent的数据结构中两个最重要的部分是活动和活动之上的数据。活动的典型的值是MAIN(the front door of the activity),VIEW,PICK,EDIT等等,数据被表示为一个URI。比如,要想浏览一个人的联系信息,你需要创建一个具有VIEW活动的Intent,数据被设为表示该人的一个URI。
还有一个相关的类叫IntentFilter。当一个Intent是一个有效的要求做某些事的请求时,一个IntentFilter描述了一个活动可以处理的所有Intent。比如,一个可以显示联系人信息的Activity会公布一个IntentFilter,告诉外界它知道在得到表示个人信息的数据之后如何处理VIEW活动。所有的Activity都在AndroidManifest.xml文件中公开它们的IntentFilter。(这段话翻起来有点烦,总之大意是一个Intent类是包含数据和指定对数据操作的对象,Intent类会交给Activity类处理,Activity类会在自己的 IntentFilter类中宣告自己能处理哪些类型的活动,比如VIEW、EDIT,程序在将一个带指定活动的Intent传递给Activity之前应该检查该Activity是否能处理Intent中的活动)
在不同窗口之间切换是通过解析Intent完成的。比如,要想回到前面的窗口,一个Activity调用startActivity(myIntent) 函数。系统会查找所有安装的程序的IntentFilter,找出其中最符合myIntent的Activity,新的启动的Activity会被告知导致它被启动的Intent。整个解析Intent的过程发生在startActivity函数调用时,主要提供两个关键功能:
Activity可以重用其它组件的功能,只需要简单的发出一个Intent格式的请求。
Activity可以在任何时候被新的Activity替代,只需要声明与老的Activity一样的IntentFilter即可。
Intent Receiver
当你希望你的程序响应外部时间时可以使用IntentReceiver。例如,电话铃响,数据网络可用,或者时间到午夜。IntentReceiver不显示UI,不过如果有某些用户感兴趣的事情发生的话,它可以使用NotificationManager来通知用户。IntentReceiver在 AndroidManifest.xml文件中注册,你也可以在代码中使用函数调用Context.registerReceiver()来注册。要让 IntentReceiver起作用并不需要保持你的程序一直处于运行状态,当一个IntentReceiver被触发时,系统会在需要的时候启动你的程序。程序也可以给别的程序发送Intent广播,通过系统调用Context.broadcastIntent()实现。
Service
Service是长期运行并且没有UI的代码。一个不错的例子就是一个从播放列表播放音乐的媒体播放器。在一个播放器程序中,应该有一个或多个活动,允许用户选择歌曲并开始播放。不过,播放音乐本身并不需要被一个Activity处理,因为用户希望在到新的窗口时音乐仍然在后台继续播放。在这种情况下播放器Activity应该通过Context.startService()函数启动一个Service,这样就可以在后台继续播放音乐。系统会让音乐播放 Service持续运行,直到播放完毕。(可以阅读文档Android程序的生命周期http: //code.google.com/android/intro/lifecycle.html,了解更多关于Service的优先级的情况)另外,你可以与一个Service连接(或者当它没有运行时启动它),使用系统调用Context.bindSercice()完成。当连接到一个Service 时,你可以通过提供的接口与它通信。对音频播放Service来说,你可以完成暂停、回退等等功能。
Content Provider
程序可以在文件、SQLite数据库中存储数据,或者任何其它有效的方式均可。如果你想与其它程序共享数据的话,content provider就非常有用了。Content provider类是实现了一组标准方法接口的类,允许其它程序保存或者取回content provider中处理的数据。
更多关于content provider的信息,请参看介绍http://code.google.com/android/devel/data/contentproviders.html。
2008年4月28日
Android学习系列之四--Anatomy of an Android Application
订阅:
博文评论 (Atom)
没有评论:
发表评论