Android 程序清单详解
每個Android應(yīng)用都需要一個名為AndroidManifest.xml的程序清單文件,這個清單文件名是固定的并且放在每個Android應(yīng)用的根目錄下。它定義了該應(yīng)用對于Android系統(tǒng)來說一些非常重要的信息。Android系統(tǒng)需要這些信息才能正常運行該應(yīng)用。Android程序清單文件主要具有下面作用:
·????????它給應(yīng)用程序Java包命名,這個包名作為應(yīng)用程序唯一標(biāo)識符。
·????????它描述了應(yīng)用程序中的每個程序組件—Activity,Service,Broadcast Receivers和Content Provider。它描述了實現(xiàn)每個應(yīng)用程序組件的類名稱和組件能力(比如組件能夠處理哪種類型的Intent消息)。這些描述幫助Andoid操作系統(tǒng)了解這些程序組件和在何種條件下可以啟動這些程序組件。
·????????它決定哪些進(jìn)程用來運行應(yīng)用程序組件。
·????????它描述了應(yīng)用程序使用某些受保護(hù)的程序API或和其它應(yīng)用程序交互所需的權(quán)限。
·????????它也描述了其它應(yīng)用程序和該應(yīng)用交互時應(yīng)擁有的權(quán)限。
·????????它列出了Instrumentation類用于提供應(yīng)用程序運行時一些性能統(tǒng)計和其它信息。這些生命只在測試或開發(fā)應(yīng)用時使用。在發(fā)布應(yīng)用時應(yīng)該刪除。
·????????它給出了應(yīng)用運行所需AndroidAPI版本的最低要求。
·????????它列出了應(yīng)用程序需要調(diào)用的開發(fā)庫定義。
?
?清單文件結(jié)構(gòu)
下面XML代碼給出了程序清單文件的基本結(jié)構(gòu)以及它所能包含的所有元素。每個元素及元素支持的屬性可以參考Android開發(fā)文檔。
<?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><intent-filter><action /><category /><data /></intent-filter><meta-data /></activity><activity-alias><intent-filter> . . . </intent-filter><meta-data /></activity-alias><service><intent-filter> . . . </intent-filter><meta-data/></service><receiver><intent-filter> . . . </intent-filter><meta-data /></receiver><provider><grant-uri-permission /><meta-data /><path-permission /></provider><uses-library /></application></manifest>
程序清單文件支持的所有元素按其字母順序排列如下,它們是程序清單支持的合法元素,你不能添加自定義的元素和屬性。
<action> <activity> <activity-alias> <application> <category> <data> <grant-uri-permission> <instrumentation> <intent-filter> <manifest> <meta-data> <permission> <permission-group> <permission-tree> <provider> <receiver> <service> <supports-screens> <uses-configuration> <uses-feature> <uses-library> <uses-permission> <uses-sdk>
?一些使用慣例
下面為使用元素和屬性時一些慣例和原則:
元素
只有<mainifest>和<application>元素是必須的,這兩個元素必須在程序清單中定義,并且只能出現(xiàn)一次。其它元素可以不出現(xiàn)或出現(xiàn)多次—盡管其中有些元素是一個有實用意義的程序清單文件所必須的。
如果一個元素包含其它元素,所有的值都是通過屬性來定義而不是通過元素內(nèi)容來定義。
同一層次的元素之間沒有先后順序的關(guān)系。比如<activity>,<provider>和<service>可以以任何次序出現(xiàn)或交替出現(xiàn)(一個特例是<activity-alias>,它必需緊跟在它對應(yīng)的<activity>之后)
屬性
嚴(yán)格上來說,所有的屬性都是可選的。但實際上必須定義某些元素的屬性值才能使用該元素有實際意義。具體可以參考開發(fā)文檔,如果某個屬性確實是可選的,開發(fā)文檔定義了它的缺省值。
除了根元素<manifest>的一些屬性,其它所有屬性的屬性名稱都是以android:作為前綴。比如android:alwaysRetainTaskState。
申明類名稱
有很多元素對應(yīng)到某個Java對象,包括應(yīng)用程序元素本身(<application>元素)和一些主要的程序組件—Activity(<activity>),Service(<service>,BroadcastReceiver (<receiver>)和ContentProvider(<provider>)。
如果你定義子類,對于應(yīng)用程序組件(Activity,Service,BroadcastReceiver和ContentProvider)來說,這是非常普遍的情況。子類名稱通過name屬性來定義。這個名成必須包括類定義完整的包定義。比如一個Service的子類可以有如下定義:
<manifest . . . ><application . . . ><service android:name="com.example.project.SecretService" . . . >. . .</service>. . .</application> </manifest>
??? 然而,為了簡化起見,如果name屬性的第一個字符為“.”,那么name屬性的值會添加到應(yīng)用程序包名稱(由<manifest>元素的<package>屬性定義)作為完整的類名稱。下面代碼實現(xiàn)上面代碼同樣的功能:
<manifest package="com.example.project" . . . ><application . . . ><service android:name=".SecretService" . . . >. . .</service>. . .</application> </manifest>
??? Android系統(tǒng)中啟動某個程序組件時會創(chuàng)建該子類的一個實例,如果沒有指明子類的名稱,Android系統(tǒng)將創(chuàng)建其基類的實例。
多個值
如果可以為某個元素設(shè)置多個值,那么對每個值都要重復(fù)元素定義,而不使用一個元素定義定義多個值。比如,一個intent可以使用多個過濾動作:
<intent-filter . . . ><action android:name="android.intent.action.EDIT" /><action android:name="android.intent.action.INSERT" /><action android:name="android.intent.action.DELETE" />. . . </intent-filter>
???資源值
??一些屬性可以有顯示給用戶的資源值—比如,某個Activity可以有標(biāo)題和一個圖標(biāo)。這些屬性值應(yīng)當(dāng)提供本地化支持并且可以通過顯示主題來設(shè)置其值。
資源值可以使用如下格式來定義:
@ [package:] type: name
其中package名稱當(dāng)資源和應(yīng)用程序中同一個包中時可以忽略,type為資源類型,比如string或drawable,name為資源的標(biāo)識符。比如:
<activity android:icon="@drawable/smallPic" . . . >
??? 對于來自某個主題中的資源使用類似的格式,當(dāng)以“?”開頭而非“@”開頭。
? [package:] type: name
字符串值
當(dāng)某個屬性值為一字符串時,必須使用雙“\”來轉(zhuǎn)義某些特殊字符,比如 “\\n”? 代表新行或“\\uxxxx”? 代表某個Unicode字符。
?Android特性設(shè)置
下面給出了如何在程序清單中設(shè)置某些Android相關(guān)的特性。
Intent Filter
應(yīng)用程序的核心組件(Activity,Service和Boradcast Reciever)都是通過Intent來觸發(fā)的。一個Intent為一組用來描述動作的信息包(Intent對象)--包括動作處理的數(shù)據(jù),能夠執(zhí)行該動作的組件的分類等等。Android根據(jù)Intent找到合適的程序組件來響應(yīng)該Intent,如果有需要創(chuàng)建程序組件的一個新實例并傳入Intent對象。
應(yīng)用程序組件發(fā)布它們的處理能力—能夠處理的Intent的種類—通過IntentFilter定義。由于Android系統(tǒng)必須事先了解那個程序組件能處理哪類Intent才能啟動合適的程序組件,因此必須在程序清單中通過<intent-filter>來定義Intent Filter。一個應(yīng)用程序組件可以有多個Intent Filter,每個Intent Filter使用獨立的一行字程序清單中定義。
一個明確指明了目標(biāo)程序組件名稱的Intent對象將觸發(fā)對應(yīng)的程序組件,此時Intent Filter不起作用。但在Intent沒有明確指明目標(biāo)程序組件名稱時,只有在目標(biāo)程序組件滿足Intent Filter定義的過濾條件時才會啟動。
圖標(biāo)和標(biāo)題
某些元素支持使用圖標(biāo)和標(biāo)題屬性,用來顯示給最終用戶。其中某些元素還支持description屬性來定義一較長的描述用來顯示在屏幕上。比如<permission>元素包括上面三個屬性,因此在詢問用戶是否賦予程序權(quán)限時顯示給用戶。
在所有情況下,在父元素中定義的icon和label屬性成為其子元素的缺省icon和label屬性。因此定義在<application>元素的icon和label屬性成為定義在其中的<activitiy>的缺省icon和label屬性。同樣,<activity>元素的icon和lable屬性也成為其中定義的<intent-filter>的缺省屬性。比如<application>元素定義了label屬性,而<activity>及<intent-filter>都沒有定義label屬性,那么由application元素定義的 label屬性將作為activity 和 intent-filter的label屬性。
權(quán)限
Permission 用來限制對設(shè)備上某部分代碼或是數(shù)據(jù)的訪問。
每種Permission由唯一的字符串來定義,通常這個字符串表明了它所限制的動作。比如,下面是Android定義的部分權(quán)限:
android.permission.CALL_EMERGENCY_NUMBERS android.permission.READ_OWNER_DATA android.permission.SET_WALLPAPER android.permission.DEVICE_POWER
? ? 一個Android功能通常由一個對應(yīng)的權(quán)限來保護(hù)。
如果一個應(yīng)用需要使用由權(quán)限保護(hù)的某個功能,它必須在程序清單文件中使用<uses-permission>標(biāo)記來聲明。然后,當(dāng)安裝該應(yīng)用時,安裝程序通過詢問用戶是否賦予該應(yīng)用所需的權(quán)限。如果賦予所需權(quán)限,應(yīng)用可以使用該功能,否則,調(diào)用失敗并且不會通知用戶。
一個應(yīng)用也可以通過權(quán)限來保護(hù)其定義的程序組件(比如Activity,Service或Content Provider)。它可以使用Android或是其它應(yīng)用定義的權(quán)限,也可以使用新定義的權(quán)限。新定義的權(quán)限使用<permission>元素在程序清單中聲明。比如,保護(hù)一個Activity可以使用如下代碼:
<manifest . . . ><permission android:name="com.example.project.DEBIT_ACCT" . . . /><uses-permission android:name="com.example.project.DEBIT_ACCT" />. . .<application . . .><activity android:name="com.example.project.FreneticActivity"android:permission="com.example.project.DEBIT_ACCT". . . >. . .</activity></application> </manifest>
值得注意的是,在本例中DEBIT_ACCT權(quán)限不僅僅使用<permission>給出了定義,使用它時還需要使用<uses-permission>元素來聲明。對該權(quán)限的使用必須事先請求以實現(xiàn)其它應(yīng)用能夠啟動這個受保護(hù)的Activity。
如果例子中使用的permission屬性設(shè)置為由其它地方定義的權(quán)限(比如android.permission.CALL_EMERGENCY_NUMBER) ,那么就沒有必要再使用<permission>聲明。然而依然需要通過<uses-permission>來請求權(quán)限。
<permission-tree>元素定義了定義在代碼中一組權(quán)限的命名空間,而<permission-group>定義了一組權(quán)限的標(biāo)題。它們只影響如何將這些權(quán)限分組顯示給用戶。元素<permission-group>沒有定義哪個權(quán)限屬于哪個分組,而只是定義了權(quán)限分組的名稱。一個權(quán)限通過<permission>元素的<permissionGroup>屬性來定義其屬于哪個分組。
開發(fā)庫
每個Android應(yīng)用都鏈接到缺省的Android開發(fā)庫,這個庫包括構(gòu)造應(yīng)用的基本開發(fā)包(包含Activity,Service,Intent,View,Button,Application,ContentProvider等類定義)。
然而,某些開發(fā)包有自己獨立的庫文件。如果你的應(yīng)用使用了這些開發(fā)包,必須在程序清單中明確申明需要鏈接到這些庫文件。對于使用到的開發(fā)包,在清單文件中使用不同的<uses-library>元素來聲明。
總結(jié)
以上是生活随笔為你收集整理的Android 程序清单详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 瑞星杀毒软件linux序列号,瑞星杀毒软
- 下一篇: 百度文库Android、Iphone客户