Android 平臺(tái)的一個(gè)顯著的特點(diǎn)是“低耦合”。Activity 是 Android 應(yīng)用的一個(gè)最基本的用戶 UI 模塊。如果采用 Windows Form 應(yīng)用作為參照,Activity 相當(dāng)于 Windows 中的 WinForm。和 Windows 應(yīng)用不同的是,運(yùn)行一個(gè) Activity 或是 Activity 之間的交互是通過消息來實(shí)現(xiàn)的。也就是說如果想在起動(dòng)一個(gè) Activity 或是在一個(gè) Activity 中啟動(dòng)另一個(gè) Activity,是通過發(fā)送Intent 消息來觸發(fā),而不像 Windows WinForm 應(yīng)用,需要調(diào) Form 示例的 Show 或是 Load 方法來實(shí)現(xiàn)。通過 Intent 消息來實(shí)現(xiàn) Activity 之間的交互,則最大程度上減小了模塊之間的耦合度。這種機(jī)制類同 Subscriber/Publisher 機(jī)制。
Android 平臺(tái)的另外一個(gè)重要特性是“重用”。一個(gè) Android 應(yīng)用可以有多個(gè) Activity 組成。拿撲克牌做比方,Android 應(yīng)用相當(dāng)于撲克牌的盒子,盒子里的每張牌就是一個(gè)相對(duì)獨(dú)立的 Activity。這個(gè)Android 應(yīng)用運(yùn)行時(shí)想當(dāng)于從撲克牌中抽取牌疊放在一起,最先抽出的牌就是 Android 應(yīng)用的主Activity,主 Activity 可以在調(diào)用其它 Activity(通過發(fā) Intent 消息),被觸發(fā)的 Activity 就像撲克牌一樣發(fā)在主 Activity 上面。這樣就形成一個(gè)“Activity”棧。在設(shè)備上按“Back”則可以如瀏覽器一樣回到上一個(gè) Activity。 Android 手機(jī)上每個(gè)應(yīng)用都是一樣的結(jié)構(gòu)。“重用”指 Android 應(yīng)用在運(yùn)行時(shí),可以觸發(fā)其它應(yīng)用中定義的 Activity。比如說在 GTalk 中想顯示某個(gè)朋友在地圖上的位置。而 GoogleMap 應(yīng)用可以顯示地圖。GTalk 不需要重復(fù)同樣的代碼或是對(duì)于類似的 Activity??梢灾苯油ㄟ^ Intent 消息來啟動(dòng) GoogleMap 中的 MapViewActivity。
下圖顯示了 Android 應(yīng)用的基本組成部分。
http://wiki.jikexueyuan.com/project/android-development-tutorial/images/9.png" alt="" />
除了 Activity 之外,Android 也可以實(shí)現(xiàn) Service,Service 類同 Windows Service,一般在后臺(tái)運(yùn)行,不含用戶界面。Brodcast Receiver 可以用來響應(yīng)一些系統(tǒng)消息?;竟δ苡悬c(diǎn)類似 Java ME 中的 PushRegistry。 比方說你想在收到短信時(shí)觸發(fā)你的應(yīng)用,可以在 Android 應(yīng)用的 Manifest 文件中定義一個(gè) Broadcast Receiver 來觸發(fā)一個(gè) Activity。
如上圖所示,Android 應(yīng)用中,Application 對(duì)象好像一個(gè)容器,里面可以包含多個(gè) Activity,多個(gè) Service 或是多個(gè) Broadcast Receiver。這些 Activity,Service,Broadcast Receiver 相對(duì)獨(dú)立,相互之間交互只能通過 Intent 消息。如同 Java ME 的 MIDlet 的 JAD 文件一樣,每個(gè)Android 應(yīng)用都有一個(gè) Manifest 文件,文件名固定為 AndroidManifest.xml。Android 應(yīng)用中定義的 Activity,Service,Broadcast Receiver 等都需要定義在這個(gè) Mainifest 文件中才能被本應(yīng)用或是其它應(yīng)用所調(diào)用。 這里還是借用 Publisher/Subscriber 的概念來說明。 一個(gè) Activity,Service 等 如果能被調(diào)用的話則需要在 Mainifest 中 Subscriber 某類消息。
<activity android:name=”.HelloWorld”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
上面是 HelloWorld 中主 Activity 在 AndroidManifest.xml 的定義,定義了這個(gè) Activity 的對(duì)應(yīng)的 class,以及可以觸發(fā)該 Activity 的 intent-filter ,(相當(dāng)于 Subscriber 某種消息),但用戶點(diǎn)擊該應(yīng)用圖標(biāo)時(shí),Android 操作系統(tǒng)將發(fā)送一個(gè) Intent 消息,Android 系統(tǒng)檢查subscribe 該 Intent 消息的 Activity,Service 或是 Broadcast Receiver,如果找到,則其動(dòng)該 Activity,Service 或是 Broadcast Receiver。對(duì)于 HelloWorld,則在屏幕上顯示“Hello World”。 除了系統(tǒng)可以發(fā)送 Intent 外,Android 引用也可以通過 startActivity(Intent) ,StartService(Intent)來向啟動(dòng)其它 Activity 或是 Service。Intent 可以帶傳入數(shù)據(jù)(參數(shù))。即使在同一個(gè)應(yīng)用中,也需要通過 Intent 來傳送信息,這樣大大降低了應(yīng)用中各個(gè)模塊之間的耦合度,從而可以無縫更換應(yīng)用中的某個(gè)模塊而不會(huì)影響其它部分。 剛開始接觸 Android 這種機(jī)制時(shí)可能會(huì)覺得不如 WinForm 的 (new Form1()).Show()來的直接方便。但從應(yīng)用的可維護(hù)性,可擴(kuò)展性來看,Android 這種低耦合設(shè)計(jì)是非常有利的。 此外,如果需要在多個(gè) Activity 這間共享一些數(shù)據(jù),可以通過擴(kuò)展 Application 類實(shí)現(xiàn),在 Application 類中定義的變量可以被應(yīng)用中所有Activity 所訪問。