2008年9月17日 星期三

Anatomy of an Android Application

Anatomy of an Android Application - 剖析Android應用程式的四大區塊
原則上Android的應用程式會由下面四個區塊所組合而成

  1. Activity
  2. Broadcast Intent Receiver
  3. Service
  4. Content Provider
並不是所有的Android程式都需要有這四個部份才行,而是由上面那四項去挑選出來組合而成。
當你決定要在你的程式裏放這些元件時,你必需將它們明確的列在AndroidManifest.xml這個檔案裏。 所以在這個xml檔案,你必需宣告你要使用的元件並且明白的指出它們所擁有的能力及需求。 manifest檔案更詳細的內容請點我

底下列出一個簡單的manifest.xml範例,這個範例程式就只有放一個Activity元件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my_domain.app.helloactivity">
<application android:label="@string/app_name">
<activity android:name=".HelloActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

(1)Activity:
Activities是四個元件當中最常被使用的。一個Activity在你的程式裏通常都會有一個畫面(single screen)可呈現出來。每個Activity都會實作出一個類別,而且這個類別是繼承自Activity這個基礎類別。你的這個類別要顯示使用者介面的話就必需再組合可視元件(Views)及回應事件功能。大部份的程式都會由多畫面(multiple screens)組成。比如:一個文字訊息傳送程式會有一個畫面是用來顯示可傳送訊息的聯絡人清單,一個畫面用來輸入要傳送的訊息內容,另一個畫面用來查閱舊的訊息內容,或是改變程式的設定畫面。每個畫面都會實作在一個Activity裏。換一個畫面就是去啟動另一個Activity起來,在某些情況下Activity可以回傳值給上一個Activity:比如說有個Activity可以讓使用者選一張照片,然後告知上一個Activity使用者選到了那張圖片。當一個新的畫面顯示出來後,上一個畫面就會進入pause的狀態,系統會將它放進歷史堆疊去。有了歷史堆疊,使用者可以很方便的返回上一個畫面。如果畫面不再需要使用的話,也可以選擇從堆疊中移除。Android會幫你管理這個歷史堆疊的資料,從家(Home)畫面開始執行的所有應用程式都會被管理到。
Intent and Intent Filters:
Android使用了一個很特別的類別叫Intent,用來從一個畫面跳到另一個畫面。Intent是用來描述一個程式想要作些什麼事情。在Intent的資料結構裏有兩個很重要的部份,一個是動作(action)及對資料產生反應(data to act upon)。action主要的內容有MAIN(程式的進入點),VIEW,PICK,EDIT等等。data則是用URI的形示來表示。比如:想要查看一個人的聯絡資料時,你需要建立一個Intent,它包含了VIEW的動作(action)及指向該人資料的URI描述句。

還有另一個相關的類別是IntentFilter。當Intent要求做某些事情時,IntentFilter被用來描述這個activity能夠做些什麼事情。比如一個activity要能夠顯示個人連絡資料,你就必需要在IntentFilter說明你要如何處理個人連絡資料並用ACTION_VIEW呈現出來。IntentFilter都會宣告在AndroidManifest.xml檔案裏。

而畫面的切來切去則是由resolving intent來實現的。當你想產生新的畫面時,現行的activity就使用startActivity(myIntent)。然後系統會根據所有已安裝的程式所定義的intent filter來看那個程式是最適合myIntent。當startActivity被呼叫時,resolving Intents的處理過程是伴隨而來的。
resolving intent提供我們兩個好處:
讓Activities可以很容易的利用Intent的方式去使用別的程式的功能。
讓Activities可以很容易的在任何情況下由新Activity所取代。

先來看看底下的範例:它的目的是希望在onClick事件引發時,使用Intent去打開http://stenlyho.blogspot.com/ 這個網頁,所以你會發現要做兩件事情,1.設定URI資料2.把uri及action傳給新的Intent,這裏的action是view,最後startActivity(intent)把intent執行起來。但按寫程式的常理來推斷,應該是把網址傳給瀏覽器啊,為什麼都沒看到執行瀏覽器的動作,只有Intent呢?這就是resolving Intent的功能囉!其實就像你在Windows裏點.doc檔時,自動會叫起word,點.txt檔時,自動會用記事本一樣的功能啦,resolving intent會根據uri內容是http開頭的,action又是VIEW時,就直接執行browser去把你設定的網址view出來給你看。

public void onClick(){
Uri uri = Uri.parse("http://stenlyho.blogspot.com/");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}

(2)Broadcast Intent Receiver :
當你想要寫一個程式來對外部的事件做些處理時,可以使用Broadcast Intent Receiver。比如:當電話響時,網路資料可以使用時,或半夜來臨時。Broadcast Intent Receiver它並不能拿來顯示UI畫面,它必需利用NotificationManager來通知使用者他們感興趣的事件發生了。
Broadcast Intent Receiver同樣的可以被宣告定義在AndroidManifest.xml檔案中,但你也可以用寫Context.registerReceiver()程式的方式來註冊你自己的Broadcast Intent Receiver。你自己的程式並不會因為BroadcastReceivers被呼叫而被它執行起來。而是當BroadcastReceiver被觸發時系統會依需求來執行相對應的程式。
程式可以利用Context.sendBroadcast()來發出他們自己的intent broadcast給其它的程式。

(3)Service
Service就是一段程式,它並沒有UI呈現畫面,但它可以長期的存在系統內執行。舉個多媒體播放器的例子來說:一個媒體播放器可能會有一個以上的activities存在,允許使用者選歌及播放歌曲。但是你可能不能一直用activity來做播放的行為,因為使用者可能會希望可以持續的播放歌曲的同時,他要去看其它的畫面,比如一邊聽歌,一邊逛網頁。
在這種情況下你就必需使用Context.startService()來使程式在背景執行,以保持音樂的持續播放。系統將會一直讓音樂保持播放的狀態,一直到它結束為止。
當它進入背景狀態時,你可以利用Context.bindService()來跟Service進行連結。當你正確的連結後,你就可以透過這個Service開放出來的界面跟它進行溝通。以剛剛放音樂的例子來看,Service應該就會開放出讓你暫停播放,倒轉,快轉等功能囉!

(4)Content Provider
應用程式可以將它們的資料儲存起來到一個檔案,存到SQLite資料庫,或其它的機制儲存起來。當你希望你的程式資料可以被其它程式使用時,Content Provider就非常有用了,Content Provider實現了讓應用程式之間互相分享資料。更多的結節請看Accessing Content Providers

資料來源:
http://code.google.com/android/intro/anatomy.html

沒有留言:

一個小故事讓我們明白資金流通的意義

“又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...