在这个章节中,我们要介绍的是有关Android应用程式的剖析。
Android应用程式基本上是由下面四个区块组合而成:
并非所有的应用程式都需要有这四种区块来组成,依开发人员的应用程式可能用到其中几个区块来组合。
一旦开发人员决定在应用程式中使用那些区块来组成,开发人员应该在AndroidManifest.xml文件中列出来。这是一个XML文件,开发人员可以在其中声明应用程式用到的区块组件以及此区块提供的功能和必要的条件。在Android Manifest File Document有完整的细节描述。(请参考下述网址:http://code.google.com/android/devel/bblocks-manifest.html )
而下述XML内容就是一个简单的AndroidManifest.xml範例。如图80所示。在这个範例中只有放一个Activity元件,就是在<activity>XML元素中。
图80
首先,我们先来看第一个区块Activity
Activity
Activities是Android四个区块中最常用的一种。在应用程式中,一个Activity通常就是一个单独的画面。每一个Activity通过一个继承了Activity基本类别来实现。这个类别将会显示一个或有多个View物件的界面。并且回应一些事件功能。
大部份的应用程式都会由多个画面来组成。例如:一个文字讯息传送程式会有一个画面是用来显示要发送讯息的联络人清单,另一个画面用来输入要传送的讯息内容,最后一个画面用来查阅旧的讯息内容或是改变程式的设定画面。
每一个画面都会实作在一个Activity里。切换到另一个画面就是去启动另一个Activity起来。在某些情况下,Activity可以回传一个数值给之前的一个Activity,例如:一个Activity让使用者选取一张照片,然后告知上一个Activity使用者选取了那张照片。
当一个新的画面打开时,之前的画面会暂停并且系统会将它放进历史堆叠中。使用者可以向后导航到之前打开的历史画面。画面也可以在不适合继续保存时,从历史堆叠中移除。Android为每一个以主画面(Home)打开的应用程式保持其历史堆叠。
Intent and Intent Filters:
Android使用一个特殊的类别叫做Intent,来在画面之间做移动的动作,Intent是用来描述一个应用程式想要做什么事情。在Intent资料结构中两个最重要的部份,一个是动作及对资料产生什么样的反应。
动作主要的内容有MAIN(程式的进入点),View,Pick,Edit等动作。而资料则是用URI的形式来表示。
例如:想要查看一个联络人的讯息,开发人员需要建立一个Intent,包含了View的动作及指向该联络人资料的URI描述句。
另一个相关的类别是Intent Filter。当Intent要求去做某些事情时,Intent Filter被用来描述这个activity能够做些什么事情。例如:一个activity要能够显示联络人资料,就必需要在Intent Filter说明要如何处理联络人资料并且用ACTION_VIEW来呈现出来。Intent Filter都会宣告在AndroidManifest.xml档案中。
而画面的切换则是由resolving intent来实现。当使用者想要产生新的画面时,现行的activity就使用startActivity(myIntent)方法。然后系统会根据所有已安装的应用程式所定义的intent filter来看那个应用程式是最适合myIntent。当startActivity方法被呼叫时,resolving Intents的处理过程是伴随而来的。
而resolving Intent提供开发人员有两个好处:
A. 让Activities可以很容易的利用Intent的机制去使用其他应用程式的功能。
B. 让Activities可以很容易的在任何情况下,由新的Activity来取代。
接下来是Broadcast Intent Receiver
Broadcast Intent Receiver:
当开发人员希望应用程式来对外部的事件做一些处理时,可以使用Broadcast Intent Receiver。例如:当电话响时,或是网路资料可以使用时,或是时间到了午夜时。Broadcast Intent Receiver并不能拿来显示出使用者介面,它必需利用Notification Manager来通知使用者所设定的事件已经触发。
Broadcast Intent Receiver同样可以在AndrodiManifest.xml档案中宣告,也可以在撰写程式码,利用 Context.registerReceiver()方法来宣告Broadcast Intent Receiver。
应用程式并不会因为Broadcast Receivers被呼叫而被它执行起来。而且当Broadcast Receivers被触发时,系统会依宣告的需求来执行相对应的应用程式。应用程式可以利用 Context.sendBroadcast()方法来发出他们自己的intent broadcast给其他的应程式。
接下来是Service
Service:
Service是没有使用者介面,而且是可以长时间运作的程式码。例如:像多媒体播放器,再播放列表中的歌曲。对于一个多媒体播放器的应用程式,可能会有一个或多个Activities在运行,使用者选择歌曲并播放,然而,并不会有一个Activity来处理播放音乐,因为使用者可能开启不同的应用程式时,音乐还是要继续播放。
此时,多媒体播放器的Activity就会使用 Content.startService()方法来让音乐持续播放。系统会一直播放音乐,直到音乐结束。
当应用程式进入背景状态时,开发人员可以利用 Content.bindService()方法来跟Service进行连结的动作。当连接到一个Service时,开发人员就可以透过该Service开放出来的介面跟应用程式进行沟通。以刚才播放音乐的Service来看,Service可能允许使用者进行音乐的暂停、倒转、快转等动作。
最后我们介绍Content Provider
Content Provider:
应用程式可以将应用程式的资料储存到档案、SQLite资料库或其他的机制储存起来。当开发人员希望应用程式的资料可以被其他应用程式共享时,Content Provider就会非常有用。Content Provider实现了让应用程式之间互相分享资料的机制。在Accessing Content Providers有完整的细节描述。(请参考下述网址:http://code.google.com/android/devel/data/contentproviders.html )。