Android 之 AndroidManifest.xml 詳解(一)

來源:互聯網
上載者:User

標籤:des   android   style   blog   http   io   ar   color   使用   

       當Android啟動一個應用程式組件之前,它必須知道哪些個組件是存在的,所以開發人員在開發過程中,必須將應用程式中出現的組件一一在AndroidManifest.xml檔案中" 聲明 ",最終這個AndroidManifest.xml檔案也會被一起打包到.apk檔案中去。

      Android的四大組件分別是:Activity、BroadCast receiver、service、Content Provider,所以如果在程式中用到了這些組件,一定要在AndroidManifest.xml檔案中" 聲明 ",否則Android應用程式在運行時,在需要跳轉到、或者需要用到組件時會報錯:找不到。

       這個manifest檔案以XML作為結構格式,而且對於所有應用程式,都叫做AndroidManifest.xml。為聲明一個應用程式組件,它還會做很多額外工作,比如指明應用程式所需連結到的庫的名稱(除了預設的Android庫之外)以及聲明應用程式期望獲得的各種許可權。

        但manifest檔案的主要功能仍然是向Android聲明應用程式的組件。下面是一個標準的AndroidManifest.xml檔案範例:

<?xml version="1.0" encoding="utf-8"?><manifest>    <!-- 基本配置 -->    <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>

       從以上範例程式碼中,可以看出Android設定檔採用XML作為描述語言,每個XML標籤都不同的含義,大部分的配置參數都放在標籤的屬性中。

各標籤的使用:

[1]<manifest>...</manifest>:是AndroidManifest.xml設定檔的根項目,必須包含一個<application>元素並且指定xlmns:android和package屬性。

(1)xlmns:android:指定了Android的命名空間,預設情況下是“http://schemas.android.com/apk/res/android”;

(2)package:是標準的應用程式套件名,也是一個應用進程的預設名稱;

(3)android:versionCode:是給裝置程式識別版本用的,必須是一個整數值代表app更新過多少次;而

(4)android:versionName:則是給使用者查看版本用的,需要具備一定的可讀性,比如“1.0.0”這樣的。

[2]<uses-permission />

       為了保證Android應用的安全性,應用程式框架制定了比較嚴格的許可權系統,一個應用必須聲明了正確的許可權才可以使用相應的功能。<uses-permission>就是我們最經常使用的許可權設定標籤,我們通過設定android:name屬性來聲明相應的許可權名相關代碼如下。

    <!-- 網路相關功能 -->    <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" />
    <!-- 讀寫sd卡檔案 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允許使用相機 -->
    <uses-permission android:name="android.permission.CAMERA" />

[3]<permission />

      許可權聲明標籤,定義了供給<uses-permission>使用的具體許可權,通常情況下我們不需要為自己的應用程式聲明某個許可權,除非需要給其他應用程式提供可調用的代碼或者資料,這個時候你才需要使用<permission>標籤。還可以和<permission-group>以及<permission-tree>配合使用來構造更有層次的、更有針對性許可權系統。<

(1)android:name:許可權名標籤;

(2)android:icon:許可權表徵圖;

(3)android:description :許可權描述等屬性。

<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"] />

[4]<instrumentation />

      用於聲明Instrumentation測試類別來監控Android應用的行為並應用到相關的功能測試中。另外,我們需要注意的是Instrumentation對象是在應用程式的組件之前被執行個體化的,這點在組織測試邏輯的時候需要被考慮到。

(1)android:functionalTest:測試功能開關;

(2)android:handleProfiling:profiling調試功能開關;

(3)android:targetPackage:測試案例目標對象。

<instrumentation>標籤文法範例如下。

<instrumentation android:functionalTest=["true" | "false"]    android:handleProfiling=["true" | "false"]    android:icon="drawable resource"    android:label="string resource"    android:name="string"    android:targetPackage="string" />

[5]<uses-sdk>

        用於指定Android應用中所需要使用的SDK的版本,文法範例如下。

<uses-sdk 
android:minSdkVersion="integer" //最低版本號碼 android:targetSdkVersion="integer" //目標版本號碼 android:maxSdkVersion="integer" //最高版本號碼
/>

[6]<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" />

[7]<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程式最基本的載入流程。

[8]<supports-screens>

        對於一些應用或者遊戲來說,只能支援某些螢幕大小的裝置或者在某些裝置中的效果比較好,我們就會使用<supports-screens>標籤來指定支援的螢幕特徵。
<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"/>

[9]<application>

        應用配置的根項目,位於<manifest>下層,包含所有與應用有關配置的元素,其屬性可以作為子項目的預設屬性,將會影響應用下的所有組件。很多屬性為組件設定了預設值。有些屬性設定了全域值並且不能被組件修改。

以下是文法範例:

<application android:allowClearUserData=["true" | "false"]             android:allowTaskReparenting=["true" | "false"]             android:backupAgent="string"             android:debuggable=["true" | "false"]             android:description="string resource"             android:enabled=["true" | "false"]             android:hasCode=["true" | "false"]             android:icon="drawable resource"             android:killAfterRestore=["true" | "false"]             android:label="string 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>

(1)android:allowClearUserData:是否給以使用者刪除使用者資料的許可權,[true|false]。

(2)android:allowTaskReparenting:應用定義的activities是否可以被從啟動的任務轉移到和他有相同並且將被帶到前台的任務,[true|false]。

(3)android:backupAgent:實現應用的備份代理的類名,BackupAgent的子類。這個屬性的名稱應該是全限定類名(如,"com.project.MyBackupAgent")。

  但是,如果名稱的首字母被設定為點號,也可以為類名(如,".MyAndroid"),他將被追加到在<manifest>元素中定義的包名後。沒有預設值。

(4)android:debuggable:應用是否可以使用debug,甚至運行在使用者模式下,[true|false]。

(5)android:description:使用者可讀的,比應用標籤更長、更多的應用描述。此值必須是一個引用字串。不像標籤,他不能被設定為寫入程式碼字串。沒有預設值。

(6)android:enabled:Android系統是否可以執行個體化應用的組件,[true|false]。如果為true時,每個組件的enabled屬性決定了此組件是否可用。如果為false,他重寫了組件指定值,所有的組件將不能用。預設為true。

(7)android:hasCode:應用是否包含代碼,[true|false]。當值為false時,在啟動組件是系統不會試著載入應用的任何代碼。預設為true。

(8)android:icon:整個應用的表徵圖,還是每個組件的預設表徵圖。這個屬性值必須被設定為drawable資源的引用。沒有預設值。

(9)android:killAfterRestore:在執行系統重設操作中,當他的設定被重設後,應用是否應該被終止。單個包的重設操作不會引起應用被關閉。整個系統的恢複操作僅代表性的發生一次,當變化第一次被設定時。第三方應用將不會經常使用此屬性。預設值為true,意思是,當整個系統被恢複時,應用運行完他的資料後,將會終止。

(10)android:label:一個易讀的應用標籤,並且還是應用的每個組件的預設標籤。這個標籤應該被設定為引用字串資源,當然他也可以像其他字串一樣在使用者

介面中指定。在應用開發時,可以被設定未定義字串。

(11)android:manageSpaceActivity:一個Activity子類的全限定名稱,這個Activity可以被系統啟動讓使用者管理此應用佔有的儲存空間。這個Activity也應該用<activity>元素宣告。

(12)android:name:為這個應用實現的Application子類的全限定名稱。當應用啟動時,這個類將在應用的其他組件之前被執行個體化。這個子類是可選的;大多數應用不需要。在預設時,Android使用基本Application類的執行個體。

(13)android:permission:使用者為了和應用互動必須設定的許可的名稱。這個屬性是一個便利的途徑為應用的組件設定許可。他可以被組件的permission屬性重寫。

(14)android:persistent:應用是否在所有時間下都保持運行,[true|false]。預設為false。通常情況下不應該設定此標識。持久模式僅僅被幾個系統應用指定。

(15)android:process:為應用下的組件定一個運行進程名稱。每個組件可以定義自己的進程名稱通過設定自己的process屬性。在預設情況下,當應用的第一個組件需要運行時,Android為應用建立一個進程。所有的組件在同一個進程下運行。這個進程的名稱和在<manifest>元素設定的backage屬性名稱相同。

通過設定這個屬性在可以在其他應用中共用,你可以協調應用的組件在同一個進程中運行,但是只有兩應用也共用使用者ID和簽訂相同的認證。

如果這個屬性的名稱一個冒號(":")開始,一個新的私人的進程將被建立。如果一個進程的名稱以小寫字母開頭,一個公用的進程將被建立。一個公用的進程可以被其他應用共用,來減少資源的使用。

(16)android:restoreAnyVersion:表明這個應用準備嘗試恢複所有的備份資料集合,甚至如果備份資料是比當前安裝的應用高的編號儲存的。設定為true將允許備份管理者去嘗試恢複當版本不匹配,意思是資料衝突。要小心使用。預設為false。

(17)android:taskAffinity:提供給應用下所有組件的類同名稱,除了設定了自己的taskAffinity屬性的組件。預設情況下所有的組件使用相同的affinity。Affinity的名稱和在<manifest>元素中設定的包名相同。

(18)android:theme:為應用下的組件定義一個引用自樣式資源的主題。activity也可以設定自己的主題,通過設定自己的theme屬性。  

Android 之 AndroidManifest.xml 詳解(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.