Android的組件設計

Android的組件設計模型,是Android的程序開發以及理解Android的安全模型的基礎。
    Android的應用程序,在官方文檔定義中,是指APK為後綴文件所包含的代碼邏輯被視為一個應用。Android應用由若幹組件構成,構成Android應用的四大組件是:Activity ,Services,Content providers,Broadcast receivers。一個問題是,組件和普通的Android JAVA對象有什麼區別?首先,組件必須在Android應用的配置文件中定義,由系統管理的調度,具有獨特的生命狀態周期,其次,組件是Android 應用安全管理的最小粒度的單元。

    在瞭解組件的技術細節之前必須先瞭解組件的運行環境。

Android組件的進程運行環境

   (1)Android是一種多用戶的Linux操作系統,每個應用使用不同的用戶ID進行運行。Android對應用的數據文件進行Linux操作層次的權限保護,賦予並僅僅賦予程序用戶的ID以訪問權限,使用其他用戶ID運行的程序無法越權訪問程序所保護的數據。

    (2)每個進程有獨立的JAVA 虛擬機器,不同的應用隔離在獨立的JAVA虛擬機器中。

    (3)缺省的情形下每個應用運行在獨立的進程中,當任意一個組件需要運行,Android負責啟動應用進程。當進程中所有的應用組件都停止運行,則Android負責停止應用進程,釋放資源。

  (4)如果兩個應用需要緊密耦合的共享應用的數據,需要將兩個應用安排在同一個應用進程運行,此時,要求兩個應用具有相同的簽名。

  

Android的四大組件元素

    在著名的《Inside the Android Application Framework》材料中,將Android的程序構成解釋如下:

 

 

    Activity是包含顯示窗口的基本的Android程序組件,人機交互的基本單元。每個Activity都是android.app.Activity的子類,Activity具有運行時的上下文和獨特的生命周期,系統根據需要進行Activity的調度。Activity可以由用戶點擊系統桌面圖標啟動或者經由其他應用啟動。

    Service組件不包含人機交互的界面,在後臺執行某長期工作任務的組件。Service組件可以由應用內部的其他組件啟動。Service組件的另一用法是實現綁定IPC(進程間通信)的接口,支持實現遠程調用。Service組件支持任意類型的後臺任務,包括執行網絡事務、播放音樂、後臺文件下載等等。

    Service組件非常特殊之處在於其後臺運行但是卻共用應用的進程空間,並占用主線程(Main Thread)。在官方的開發文檔中,對這一點進行瞭著重的聲明,如果需要在Service中執行長期或者高強度的任務,建議創建另外的工作線程來完成,否則,會拖慢或者阻塞應用進程內的其他Activity類型的組件的響應效率,給用戶帶來不好的體驗。

    Content Provider組件用於管理應用中的可共享的數據,例如,文件、數據庫。如果數據僅僅是本應用范圍使用,可以不需要Content Provider,直接使用SQLiteDatabase。Content Provider的一個特點是不需要編寫訪問的客戶端,訪問時客戶端應用在上下文中獲取ContentResolver對象,該對象負責與特定的Content URI對應的的Content Provider的通信交互。Android本身也使用Content Provider的機制來保存音頻、視頻、圖像、個人聯系人信息。

    Broadcast receivers組件用於接收系統范圍內的事件聲明,例如,屏幕將被關黑、電池處在低電狀態等等。應用也能發起事件廣播,用於一些場合,比如說,某數據已經下載完畢,通知相關應用讀取等等。雖然Broadcast receivers不包含人機交互的窗口,但是能夠Android的狀態通知欄來通知用戶廣播事件的發生。 Broadcast receivers最通常的用法是,接收廣播事件之後Broadcast receivers將執行的控制權傳遞給其他組件,例如,啟動Service針對廣播事件執行某項任務。

 

Android組件設計關鍵特點

   Android組件設計的關鍵特點是:任意程序都可以啟動另一個程序的組件。例如,某團隊開發一程序包含打開攝像頭並抓拍一張照片,此功能已經有另一應用的一系列組件完整實現,則團隊不需要重新開發一遍,隻需要直接使用應用的組件即可。所謂的“直接使用” 甚至不用將已有應用的組件鏈接進新的程序。這是如何完成的呢,可以從Android組件的通信機制中得到答案。

    從資料中能夠總結Android有幾種組件通信機制:Intent 機制、IPC Binding機制和ContentResolver。Intent的機制能夠喚起Android的三種組件,Activity ,Service ,和Boardcast Receiver  ,是Android組件間主要的通信方式,是一種間接的通信方法。IPC Binding機制是使用遠程函數調用的方法與Service組件通信,ContentResolver用於與ContentProvider組件通信。

Android組件的通信機制

    Intent是一種Android組件間異步事件對象,攜帶瞭發送組件的“操作意圖”。翻譯成自然語言:發送Intent組件期望某個具體的組件(顯式指定)或者期望系統幫忙找合適的組件(隱式指定)完成一項具體的任務,系統找到目標組件後,如果其沒有處在運行狀態,則負責創建組件、並調度到運行狀態執行指定的任務。Intent機制保證瞭Android可以最大限度的重用系統的、或者其他安裝應用的成熟組件。

   對Activity組件和Service組件來說,接收到的Intent對象包含一個操作(例如,查看View ,發送Send),以及操作對應的數據對象的URI以及必要的參數。舉例來說:查看某個圖像,打開某個網頁等等。一種很常用的用法是,向某個Activity發送Intent對象要求其完成一項任務並將操作的結果數據包含在一個“Intent”對象返回給發送者。舉例來說,許多應用會發送Intent來完成用戶從電話本中選擇聯系人,並將選擇的結果返回。

   對Broadcast receivers來說,其接收的Intent包含廣播的事件聲明,例如,低電的狀態,其Intent僅僅包含一個操作的字符串指明設備正處在低電的狀態。

    Service組件能夠支持遠程函數調用接口,這就是IPC 的Binding 用法。這是Service組件與其他組件通信一種特殊通信方式。

    Content Provider組件不能由Intent喚醒,ContentProvider僅僅與ContentResolver通信,由其喚醒。ContentResolver處理與ContentProvider通信的整個過程,與ContentProvider通信的組件不需要添加額外的邏輯僅僅調用ContentResolver即可。

 

 

Android組件組成示例

   下面以一個程序的組件構成實例進行分析。程序的基本功能為:查看好友所在的地理位置,以地圖的方式顯示,並在附近的好友經過時提示用戶。整個人機交互過程涉及三個應用,第一個應用為FriendTracker,跟蹤本人以及好友的位置,第二個應用為FriendViewer,查看好友所在位置,第三個應用為系統的聯系人應用,用於查看聯系人。其組件結構分析如圖,其中的淺紅色的幾何圖形代表著某種Android組件,藍色的幾何圖形代表普通的JAVA對象,藍色箭頭的線表示某種組件間的通信方式。

 

   

    整個功能由三個應用完成,第一個應用FriendTracker APP負責跟蹤本人以及朋友的地理位置,本人的經緯度信息從本機的LocationManager中獲取,朋友的經緯度從網絡中心服務器獲取。

    FriendTracker APP由一個FrendTracker Activity組件、一個FriendTracker Service組件、以及一個Friend Provider組件構成。FrendTracker Activity組件提供一個人機交互的窗口,讓用戶啟動或者停止“朋友追蹤”服務,此時FrendTracker Activity通過startService函數發送Intent啟動FriendTracker Service組件。

   FriendTracker Service啟動後啟動LocationManager、啟動定時器、啟動工作線程從網絡獲取朋友的地理位置信息,通過FriendProvider寫入數據庫,然後由系統調度,可能進入休眠。當定時器到期時會向系統發送一個Intent,這個Intent會喚醒FriendTracker Service ,經喚醒後,再次啟動工作線程獲取朋友的地理位置信息。當用戶的地理位置信息發生變化,則FriendTracker Service計算與每個朋友的位置,如果發現500米內有朋友,則發出一條廣播的Intent。該Intent喚起FriendViewer App,APP包含一個FriendViewer Activity,負責從FriendProvider將每個朋友的位置信息讀出並顯示。從FriendViewer Activity的窗口列表選擇朋友的時候,發送Intent觸發FriendMap Activity喚醒並顯示地圖標註朋友所在的位置。當然,也可以從FriendViewer Activity的窗口列表選擇朋友查看朋友的詳細信息,此時,發送Intent觸發瞭系統的APP應用。www.aiwalls.com

    這裡可以看到FriendTracker Service是啟動其他線程來完成其工作任務,原因如上文對Service的描述所示。

    而一個整體應用的功能分散在三個子應用中,無疑是為瞭更好的共享重用、升級管理。

    復雜的是,每一個組件間的通信關系大多都意味著需要權限的管理,特別是跨應用的組件通信。Android的組件的權限管理因此而復雜。這個問題,就留作下次的研究內容。
作者:shallon_luo

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *