<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myweixin" android:versionCode="1" android:versionName="1.0" > <!-- 基本配置 --> <uses-permission /> <permission /> <permission-tree /> <permission-group /> <instrumentation /> <uses-sdk /> <uses-configuration /> <uses-feature /> <supports-screens /> <compatible-screens /> <supports-gl-texture /> <!-- 應用配置 --> <application> <!-- Activity 配置 --> <activity> <intent-filter> <action /> <category /> <data /> </intent-filter> <meta-data /> </activity> <activity-alias> <intent-filter> . . . </intent-filter> <meta-data /> </activity-alias> <!-- Service 配置 --> <service> <intent-filter> . . . </intent-filter> <meta-data/> </service> <!-- Receiver 配置 --> <receiver> <intent-filter> . . . </intent-filter> <meta-data /> </receiver> <!-- Provider 配置 --> <provider> <grant-uri-permission /> <meta-data /> </provider> <!-- 所需類庫配置 --> <uses-library /> </application> </manifest>
<manifest>
AndroidManifest.xml 配置文件的根元素,必須包含一個<application>元素而且指定xlmns:android和package屬性。 xlmns:android指定了Android的命名空間,默認狀況下是「http://schemas.android.com/apk/res /android」;而package是標準的應用包名,也是一個應用進程的默認名稱,咱們爲了不命名空間的衝突,通常會以應用的域名來做爲包名。固然還有一些其餘經常使用的屬 性須要注意一下,好比android:versionCode是給設備程序識別版本用的,必須是一個整數值表明app更新過多少次;而 android:versionName則是給用戶查看版本用的,須要具有必定的可讀性,好比「1.0.0」這樣的。<manifest>標 籤語法範例以下。
java
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="string" android:sharedUserId="string" android:sharedUserLabel="string resource" android:versionCode="integer" android:versionName="string" android:installLocation=["auto" | "internalOnly" | "preferExternal"] > ... ... </manifest>
<uses-permission>
爲 了保證Android應用的安全性,應用框架制定了比較嚴格的權限系統,一個應用必須聲明瞭正確的權限纔可使用相應的功能,例如咱們須要讓應用可以訪問 網絡就須要配置「android.permission.INTERNET」,而若是要使用設備的相機功能,則須要設置 「android.permission.CAMERA」等。<uses-permission>就是咱們最常用的權限設定標籤,咱們經過設定android:name屬性來聲明相應的權限名。例:android
<manifest ...> ... ... <!-- 網絡相關功能 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 讀取電話狀態 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 通知相關功能 --> <uses-permission android:name="android.permission.VIBRATE" /> ... ... </manifest>
<permission>
權 限聲明標籤,定義了供給<uses-permission>使用的具體權限,一般狀況下咱們不須要爲本身的應用程序聲明某個權限,除非須要給 其餘應用程序提供可調用的代碼或者數據,這個時候你才須要使用<permission>標籤。該標籤中提供了android:name權限名 標籤,權限圖標android:icon以及權限描述android:description等屬性,另外還能夠和<permission- group>以及<permission-tree>配合使用來構造更有層次的、更有針對性權限系 統。<permission>標籤語法範例以下。正則表達式
<permission android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" android:permissionGroup="string" android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />
<instrumentation>
用 於聲明Instrumentation測試類來監控Android應用的行爲並應用到相關的功能測試中,其中比較重要的屬性有:測試功能開關 android:functionalTest,profiling調試功能開關android:handleProfiling,測試用例目標對象 android:targetPackage等。另外,咱們須要注意的是Instrumentation對象是在應用程序的組件以前被實例化的,這點在組 織測試邏輯的時候須要被考慮到。<instrumentation>標籤語法範例以下。安全
<instrumentation android:functionalTest=["true" | "false"] android:handleProfiling=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:targetPackage="string" />
<uses-sdk>
用 於指定Android應用中所須要使用的SDK的版本,好比咱們的應用必須運行於Android 2.0以上版本的系統SDK之上,那麼就須要指定應用支持最小的SDK版本數爲5;固然,每一個SDK版本都會有指定的整數值與之對應,好比咱們最經常使用的 Android 2.2.x的版本數是8。固然,除了能夠指定最低版本以外,<uses-sdk>標籤還能夠指定最高版本和目標版本,語法範例以下。
<uses-sdk android:minSdkVersion="integer"
android:targetSdkVersion="integer"
android:maxSdkVersion="integer" />網絡
<uses-configuration>與<uses-feature>
這 兩個標籤都是用於描述應用所須要的硬件和軟件特性,以便防止應用在沒有這些特性的設備上安裝。<uses-configuration>標籤 中,好比有些設備帶有D-pad或者Trackball這些特殊硬件,那麼android:reqFiveWayNav屬性就須要設置爲true;而若是 有一些設備帶有硬件鍵盤,android:reqHardKeyboard也須要被設置爲true。另外,若是設備須要支持藍牙,咱們可使 用<uses-feature android:name="android.hardware.bluetooth" />來支持這個功能。這兩個標籤主要用於支持一些特殊的設備中的應用,兩個標籤的語法範例分別以下。
<uses-configuration android:reqFiveWayNav=["true" | "false"]
android:reqHardKeyboard=["true" | "false"]
android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"]
android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"]
android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />
<uses-feature android:name="string"
android:required=["true" | "false"]
android:glEsVersion="integer" />app
<uses-library>
用 於指定Android應用可以使用的用戶庫,除了系統自帶的android.app、android.content、android.view和 android.widget這些默認類庫以外,有些應用可能還須要一些其餘的Java類庫做爲支持,這種狀況下咱們就可使用<uses- library>標籤讓ClassLoader加載其類庫供Android應用運行時用。<uses-library>標籤的用法很簡 單,如下是語法範例。
<uses-library android:name="string"
android:required=["true" | "false"] />框架
小貼士:
當運行Java程序時,首先運行JVM(Java虛擬機),而後再把Java類加載到JVM裏頭運 行,負責加載Java類的這部分就叫作ClassLoader。固然,ClassLoader是由多個部分構成的,每一個部分都負責相應的加載工做。當運行 一個程序的時候,JVM啓動,運行BootstrapClassLoader,該ClassLoader加載java核心 API(ExtClassLoader和AppClassLoader也在此時被加載),而後調用ExtClassLoader加載擴展API,最後 AppClassLoader加載CLASSPATH目錄下定義的Class,這就是一個Java程序最基本的加載流程。
<supports-screens>
對 於一些應用或者遊戲來講,只能支持某些屏幕大小的設備或者在某些設備中的效果比較好,咱們就會使用<supports-screens>標籤 來指定支持的屏幕特徵。其中比較重要的屬性包括:屏幕自適應屬性android:resizeable,小屏 (android:smallScreens)、中屏(android:normalScreens)、大屏 (android:largeScreens)和特大屏(android:xlargeScreens)支持屬性,按屏幕渲染圖像屬性 android:anyDensity以及最小屏幕寬度屬性android:requiresSmallestWidthDp 等。<supports-screens>標籤的語法範例以下。
<supports-screens android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"]
android:normalScreens=["true" | "false"]
android:largeScreens=["true" | "false"]
android:xlargeScreens=["true" | "false"]
android:anyDensity=["true" | "false"]
android:requiresSmallestWidthDp="integer"
android:compatibleWidthLimitDp="integer"
android:largestWidthLimitDp="integer"/>
<application>
應 用配置的根元素,位於<manifest>下層,包含全部與應用有關配置的元素,其屬性能夠做爲子元素的默認屬性,經常使用的屬性包括:應用名 android:label,應用圖標android:icon,應用主題android:theme等。固然,<application> 標籤還提供了其餘豐富的配置屬性,因爲篇幅緣由就不列舉了,你們能夠打開Android SDK文檔來進一步學習,如下是語法範例。
<application android:allowTaskReparenting=["true" | "false"]
android:backupAgent="string"
android:debuggable=["true" | "false"]
android:description="string resource"
android:enabled=["true" | "false"]
android:hasCode=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:killAfterRestore=["true" | "false"]
android:label="string resource"
android:logo="drawable resource"
android:manageSpaceActivity="string"
android:name="string"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme" >
... ...
</application>
<activity>
Activity 活動組件(即界面控制器組件)的聲明標籤,Android應用中的每個Activity都必須在AndroidManifest.xml配置文件中聲 明,不然系統將不識別也不執行該Activity。<activity>標籤中經常使用的屬性有:Activity對應類名 android:name,對應主題android:theme,加載模式android:launchMode(詳見2.1.3.4節),鍵盤交互模式 android:windowSoftInputMode等,其餘的屬性用法你們能夠參考Android SDK文檔學習。另外,<activity>標籤還能夠包含用於消息過濾的<intent-filter>元素,固然還有可用於 存儲預約義數據的<meta-data>元素,如下是<activity>標籤的語法範例。
<activity android:allowTaskReparenting=["true" | "false"]
android:alwaysRetainTaskState=["true" | "false"]
android:clearTaskOnLaunch=["true" | "false"]
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "orientation", "screenLayout",
"fontScale", "uiMode"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"]
android:multiprocess=["true" | "false"]
android:name="string"
android:noHistory=["true" | "false"]
android:permission="string"
android:process="string"
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
android:stateNotNeeded=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
... ...
</activity>
<activity-alias>
Activity 組件別名的聲明標籤,簡單來講就是Activity的快捷方式,屬性android:targetActivity表示的就是其相關的Activity 名,固然必須是前面已經聲明過的Activity。除此以外,其餘比較常見的屬性有:Activity別名名稱android:name,別名開關 android:enabled,權限控制android:permission等。另外,咱們還須要注意的是,Activity別名也是一個獨立的 Activity,能夠擁有本身的<intent-filter>和<meta-data>元素,其語法範例以下。
<activity-alias android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:targetActivity="string" >
... ...
</activity-alias>
<intent-filter>與<action>、<category>、<data>
<intent- filter>用於Intent消息過濾器的聲明,在前面的2.1.3.2節中咱們已經對Android應用框架中的Intent消息做過比較詳細 的介紹,咱們瞭解到Intent消息對於Android應用系統來講,是很是重要的「粘合劑」,<intent-filter>元素能夠放 在<activity>、<activity-alias>、<service> 和<receiver>元素標籤中,來區分可用於處理消息的Activity控制器、Service服務和廣播接收器Broadcast Receiver。另外,咱們還知道Intent消息還包含有名稱、動做、數據、類別等幾個重要屬性。這點與該標籤的寫法也有必定的關係,比 如<intent-filter>中必須包含有<action>元素,即用於描述具體消息的名 稱;<category>標籤則用於表示能處理消息組件的類別,即該Action所符合的類別;而<data>元素則用於描述消 息須要處理的數據格式,咱們甚至還可使用正則表達式來限定數據來源。固然,這些元素和標籤的具體用法咱們還須要慢慢學習,下面是標 準<intent-filter>元素標籤的語法範例。
<intent-filter android:icon="drawable resource"
android:label="string resource"
android:priority="integer" >
<action android:name="string" />
<category android:name="string" />
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string" />
</intent-filter>
<meta-data>
用 於存儲預約義數據,和<intent-filter>相似,<meta-data>也能夠放 在<activity>、<activity-alias>、<service> 和<receiver>這四個元素標籤中。Meta數據通常會以鍵值對的形式出現,個數沒有限制,而這些數據都將被放到一個Bundle對象 中,程序中咱們則可使用ActivityInfo、ServiceInfo甚至ApplicationInfo對象的metaData屬性中讀取。假設 咱們在一個Activity中定義了一個<meta-data>元素,相關示例用法以下。
<activity...>
<meta-data android:name="testData" android:value="Test Meta Data"></meta-data>
</activity>
ActivityInfo info = this.getPackageManager()
.getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
String testData = info.metaData.getString("testData");
System.out.println("testData:" + testData);
<service>
Service 服務組件的聲明標籤,用於定義與描述一個具體的Android服務,主要屬性有:Service服務類名android:name,服務圖標 android:icon,服務描述android:label以及服務開關android:enabled等。關於Service服務組件的概念和用法 請參考2.1.4.2節的內容,如下是<service>標籤的語法範例。
<service android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
... ...
</service>
<receiver>
Boardcast Receiver廣播接收器組件的聲明標籤,用於定義與描述一個具體的Android廣播接收器,其主要屬性和<service>標籤有些類 似:Boardcast Receiver接收器類名android:name,接收器圖標android:icon,接收器描述android:label以及接收器開關 android:enabled等。關於Boardcast Receiver廣播接收器組件的概念和用法請參考2.1.4.3節的內容,如下是<receiver>標籤的語法範例。
<receiver android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
... ...
</receiver>
<provider>與<grant-uri-permission>
除 Activity、Service和Boardcast Receiver以外的另外一個「四大組件」,也就是Content Provider內容提供者的聲明標籤。關於內容提供者組件的概念和用法請參考2.1.4.4節的內容,再也不贅述。<provider>標籤 除了和其餘組件相同的android:name、android:icon和android:label等基礎屬性以外,還提供了用於支持其功能的特殊屬 性,如:內容提供者標識名稱android:authorities,對指定URI授予權限標識android:grantUriPermission以 及具體的讀、寫權限,即android:readPermission和android:writePermission等。固然,這些屬性的具體用法我 們還須要慢慢學習,如下是<provider>標籤的語法範例。
<provider android:authorities="list"
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:grantUriPermissions=["true" | "false"]
android:icon="drawable resource"
android:initOrder="integer"
android:label="string resource"
android:multiprocess=["true" | "false"]
android:name="string"
android:permission="string"
android:process="string"
android:readPermission="string"
android:syncable=["true" | "false"]
android:writePermission="string" >
... ...
</provider>
ide