什麼是Android應用程序的構成?html
Android應用程序的各個組件又是什麼?node
各個組件和AndroidManifest之間的關係是什麼?android
Android應用程序由鬆散耦合的組件組成,並使用應用程序Manifest綁定在一塊兒;應用程序的AndroidManifest.xml文件描述了每一個組件和它們之間的交互方式。還用於指定應用程序元數據、其硬件和平臺要求、外部庫以及必要的權限。數據庫
Android應用程序的組件:安全
Activity:是應用程序的表示層。應用程序中的每個UI都是經過Activity類的一個或多個擴展實現的。Activity使用Fragment和視圖來佈局和顯示信息,以及響應用戶動做。app
Service:應用程序中不可見的工做者。Service組件在運行時沒有UI,它們能夠更新數據源和Activity、觸發通知和廣播Intent。框架
Content Provider:一個可共享的持久數據存儲器(談到持久化存儲機制,首先想到的是數據庫)。Content Provider用來管理和持久化應用程序數據,一般會與SQL數據庫交互。它是應用程序之間共享數據的首選方法。(我的認爲:該功能更多的是提供數據訪問,便是讀數據)ide
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用於指定該應用程序須要的共享庫。能夠指定特定的一個包是必需的仍是可選的。指定爲必需時,在缺乏指定庫的設備上將沒法安裝該應用程序。