Android應用程序的結構和解析


什么是Android應用程序的構成?

Android應用程序的各個組件又是什么?

各個組件和AndroidManifest之間的關系是什么?

 

Android應用程序由松散耦合的組件組成,並使用應用程序Manifest綁定在一起;應用程序的AndroidManifest.xml文件描述了每個組件和它們之間的交互方式。還用於指定應用程序元數據、其硬件和平台要求、外部庫以及必要的權限。

Android應用程序的組件:

Activity:是應用程序的表示層。應用程序中的每一個UI都是通過Activity類的一個或多個擴展實現的。Activity使用Fragment和視圖來布局和顯示信息,以及響應用戶動作。

Service:應用程序中不可見的工作者。Service組件在運行時沒有UI,它們可以更新數據源和Activity、觸發通知和廣播Intent。

Content Provider:一個可共享的持久數據存儲器(談到持久化存儲機制,首先想到的是數據庫)。Content Provider用來管理和持久化應用程序數據,通常會與SQL數據庫交互。它是應用程序之間共享數據的首選方法。(個人認為:該功能更多的是提供數據訪問,即是讀數據)

Intent:一個強大的應用程序間的消息傳遞框架。Intent可以用來啟動和停止Activity和Service,在系統范圍內或向目標Activity、Service或Broadcast Receiver廣播消息,以及請求對特定的一條數據執行操作。

Broadcast Receiver:Intent偵聽器。Broadcast Receiver使應用程序可以監聽到那些匹配指定的過濾標准的Intent廣播。Broadcast Receiver會自動啟動應用程序來響應某個收到的Intent,這個特點讓Broadcast Receiver成為了事件驅動的應用程序的最佳選擇。

Widget:通常會被添加到設備主屏幕的可視化應用程序組件。Widget是Broadcast Receiver的特殊變體。(這一點怎么理解?和Broadcast Receiver的關系是什么?Widget有什么功能?)

Notification:該組件允許向用戶發送信息,但卻不會過分吸引他們的注意力或者打斷他們當前的Activity。這種方式是當應用程序不可見或不活動時吸引用戶注意的首選方法。

AndroidManifest.xml文件簡介:

每個Android應用程序都包含一個Manifest文件——AndroidManifest.xml,該文件存儲在項目層次中的最底層。Manifest可以定義應用程序及其組件和需求的結構和元數據。

它包含了組成應用程序的每一個Activity、Service、Content Provider和Broadcast Receiver的節點,並使用Intent Filter和權限來確定這些組件之間以及組件和其他應用程序的交互方式。

該文件還可以指定應用程序的元數據(如:圖標、版本號或主題風格)以及額外的頂層節點,這些節點用來指定必需的安全權限和單元測試,以及定義硬件、屏幕和平台支持要求。

特別需要注意的是:使用installLocation屬性,指定是否允許(或首選)將應用程序安裝到外部存儲器而不是內部存儲器上。

當把應用程序安裝到外部存儲器上時,如果用於使用USB大容量存儲器想計算機復制文件,或如果用戶拒絕或取出SD卡,應用程序將立即終止。上述情況將直接影響到用戶體驗,以下幾類應用程序不適合安裝到外部存儲設備中:

1. 就有Widget、Live Wallpaper和Live Folder的應用程序;

2. 提供不中斷服務的應用程序;

3. 輸入法引擎;

4. 設備管理器。

內部存儲器的容量一般是有限的,所以最好是只要有可能,就把應用程序安裝到外部存儲器上。

Manifest.xml文件中都有哪些標簽或節點node?

該文件由根節點引導:<manifest...>,該node具有的屬性值如下:

可用的節點node有以下幾種:

節點node:uses-sdk,用於定義要想正確運行應用程序,設備上必須具有的最低和最高SDK版本,以及為應用程序設計的目標SDK,分別使用minSDKVersion,maxSDKVersion,targetSDKVersion屬性設置。

需要注意的是:支持的SDK版本不等同於平台版本,也不能從平台版本導出(SDK--software development toolkit)。

節點uses-configuration:指定應用程序支持的每個輸入機制的組合。一般不需要包含這個節點,不過對於需要特殊輸入控制的游戲應用程序來說,非常有用。可以配置的屬性值有:reqFiveWayNav,reqHardKeyboard,reqKeyboardType,reqNavigation,reqTouchScreen五種。在指定必需的配置時,如果設備不具有任意一種指定配置,則應用程序將不會安裝到設備上。

節點uses-feature:指定應用程序需要的硬件功能,可以避免將應用程序安裝到不包含必要的硬件功能(如NFC硬件)的設備上。

    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature android:name="android.hardware.camera.flash" />
    <uses-feature android:name="android.hardware.nfc"/>

包括:音頻、藍牙、攝像頭、位置、麥克風、NFC、傳感器、電話服務、觸摸屏、USB、WIFI等。

節點supports-screens:指定應用程序中布局文件支持的屏幕。

節點uses-permission:聲明應用程序需要的權限;在安裝應用程序的時候,所有權限都將告訴用戶。對很多API和方法調用來說,權限都是必需的,特別是那些需要付費或者有安全問題的服務。

節點permission:應用程序組件創建權限來限制對共享應用程序組件的訪問。使用permission標簽來創建權限定義。

節點instrumentation:instrumentation類提供一個測試框架,用來在應用程序運行時測試應用程序組件。對於為應用程序創建的每一個測試類,都需要創建一個新的節點。

節點application:一個manifest只能包含一個application節點。該節點使用各種屬性來指定應用程序的各種元數據(包括標題、圖標和主題)。application節點還可以包含Activity、Service、Content Provider和Broadcast Receiver節點的容器,它包含的這些節點指定了應用程序組件。其中使用android:name屬性可以指定自定義Applicatioin類的名稱。

應用程序內的每一個Activity都要求有一個activity標簽,並使用android:name屬性來指定Activity類的名稱。此時必須包含核心的啟動Activity和其他所有可以顯示的Activity。啟動任何一個沒有在Manifest中定義的Activity時都會拋出一個運行時異常。

其中service、provider、receiver這些標簽和activity標簽一樣,都標記的是應用程序中對應的Service、Content Provider和Broadcast Receiver類。

其中uses-library用於指定該應用程序需要的共享庫。可以指定特定的一個包是必需的還是可選的。指定為必需時,在缺少指定庫的設備上將無法安裝該應用程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM