天天看點

Google Android 應用程式結構

原文出處:http://www.robotercoding.com/blog/?p=33

對http://code.google.com/android/intro/anatomy.html進行了翻譯

在一個Android 應用中有如下的四種元件:

* Activity 活動元件

* Intent Receiver 接受處理元件

* Service 服務元件

* Content Provider 内容提供元件

一個Android 應用并不需要同時具有這四個元件,應用可以組合這些元件。

在應用中一旦決定使用了哪些元件,就需要在AndroidManifest.xml檔案中列舉出來。可以參考Android manifest file documentation

Activity

Activities是最普遍的元件,在應用中通常用于顯示一個螢幕(頁面)的内容,僅僅一個螢幕(頁面)的内容。開發人員需要從Activity基 類繼承下來,管理UI顯示和UI的回報事件。大多數應用程式都會有多個螢幕(頁面)的内容,如一個文本消息的應用程式,第一個頁面要顯示聯系人清單,第二 個頁面要寫東西給標明的聯系人,其他頁面顯示舊的文本内容或者其他等等。每一個頁面都被當做一個Activity(活動元件),移動到其他頁面意味着開始 了一個新的Activity(活動元件)。在某些場景下,一個Activity可以傳回值給前一個Activity,如一個頁面選擇了一張圖檔,可以傳回 這張圖檔給調用者(Activit)。

打開新的頁面時,前一個頁面将會暫停,放置到一個曆史堆棧中,使用者可以使用後退鍵浏覽前面的頁面,頁面也可以從堆棧中删除。Android會為每一個從首頁面home screen(idle界面?)啟動的應用維護一個曆史堆棧清單。

Intent and Intent Filters

Android使用一個叫Intent的類從一個頁面移動到另外一個頁面。一個Intent描述了應用将要做的事情,就是一種動作行為。最重要的有兩點: 動作的類型和動作所捎帶的參數(資料),典型的動作類型為MAIN(activity的正門),VIEW, PICK, EDIT等等。參數資料以URI形式來表示。例如,為了檢視一個人的聯系資訊,需要建立一個Intent,動作類型為VIEW,人名為參數資料(需要格式 化為URI)。

一個Activity為了表明能夠處理某些Intent,Android設計了一個相關的類IntentFilter,Activity在 IntentFilter中決定它能夠處理的Intent動作類型,IntentFilter需要在AndroidManifest.xml檔案中進行聲 明。

從一個頁面到另外一個頁面跳轉的依據在于發出的Intent,為了向前浏覽,Activity調用startActivity(myIntent). Android系統在所有安裝的應用程式中查找intent filters,找出最能夠比對myIntent的Activity。新的activity将被啟動,intent被傳入。有如下兩個關鍵點:

* Activities 能夠重新被使用

* Activities 在任何時候都可以被替換,隻要一個Activity設定了相同的IntentFilter

Intent Receiver

在應用程式中,針對外部事件需要執行一些動作來回報,可以使用IntentReceiver類。例如:來了一個電話,或者資料通道可用,或者晚上到了。 Intent Receiver沒有UI的顯示,盡管可以通過NotificationManager 通知使用者某些有趣的事情發生了。Intent Receivers也需要在AndroidManifest.xml中進行聲明,當然也可以在程式中調用 Context.registerReceiver()接口動态聲明。同時在應用程式沒有跑起來的時候也能夠調用Intent Receivers,當一個Intent Receivers被觸發時,Android系統将會啟動這個應用程式。應用程式也能夠通過Context.broadcastIntent()廣播他們 的Intent。

Service

一個Service是沒有UI,一直運作在背景的代碼元件。一個好的例子:播放器從一個播放清單中播放歌曲。在一個播放器應用中,大概會有一個或多個 Activity元件允許使用者選擇歌曲和播放它們,歌曲播放代碼不應該放在Activity元件中,因為我們希望一直能夠聽歌,甚至切換到了其他頁面。所 以,播放器頁面應該啟動一個服務元件(Context.startService())來播放歌曲。Android系統将會保持service運作直到它 結束(可以參考“Android 應用的生命周期”一文)。可以使用Context.bindService()接口連接配接上一個服務(如果這時候服務沒有啟動,連接配接會導緻服務啟動),連接配接 上之後,就可以和服務進行通訊。像播放器的例子,可以允許暫停,重繞等等。

Content Provider

應用程式可以在檔案中,資料庫或者其他裝置存儲他們的資料。Content Provider用于将各個應用程式的資料進行共享,Content Provider是一個類,執行一套标準的方法,讓其他的應用程式存儲和擷取Content Provider所處理的資料。更多的内容可以參考 Accessing Content Providers.

繼續閱讀