AndroidManifest.xml簡述:
AndroidManifest.xml 是每個android程序中必須的文件。它位於整個項目的根目錄,描述了package中暴露的組件(activities, services, 等等),他們各自的實現類,各種能被處理的數據和啟動位置。 除了能聲明程序中的Activities, ContentProviders, Services, 和Intent Receivers,還能指定permissions和instrumentation(安全控制和測試)
屬性:<manifest>
//xmlns:android 定義android命名空間,一般為http://schemas.android.com/apk/res/android,Android中各種標准屬性能在文件中使用,提供了大部分元素中的數據
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
//指定本應用內java主程序包的包名,它也是一個應用進程的默認名稱
package="com.woody.test"
//表明數據權限,因為默認情況下,Android給每個APK分配一個唯一的UserID,所以是默認禁止不同APK訪問共享數據的。若要共享數據,第一可以采用Share Preference方法,第二種就可以采用sharedUserId了,將 不同APK的sharedUserId都設為一樣,則這些APK之間就可以互相共享數據了
android:sharedUserId="string"
//一個共享的用戶名,它只有在設置了sharedUserId屬性的前提下才會有意義
android:sharedUserLabel="string resource"
//給設備程序識別版本(升級)用的必須是一個interger值代表app更新過多少次,比如第一版一般為1,之后若要更新版本就設置為2,3等
android:versionCode="integer"
//此名稱是給用戶看的,你可以將你的APP版本號設置為1.1版,后續更新版本設置為1.2、2.0版本等
android:versionName="string"
//安裝參數,是Android2.2中的一個新特性,installLocation有三個值可以選擇:internalOnly、auto、preferExternal
//1.選擇preferExternal,系統會優先考慮將APK安裝到SD卡上(當然最終用戶可以選擇為內部ROM存儲上,如果SD存儲已滿,也會安裝到內部存儲上)
//2.選擇auto,系統將會根據存儲空間自己去適應
//3.選擇internalOnly是指必須安裝到內部才能運行
//需要進行后台類監控的APP最好安裝在內部,而一些較大的游戲APP最好安裝在SD卡上。
//現默認為安裝在內部,如果把APP安裝在SD卡上,首先得設置你的level為8,並且要配置android:installLocation這個參數的屬性為preferExternal)
android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
< /manifest>
屬性;Application
一個AndroidManifest.xml中必須含有一個Application標簽,這個標簽聲明了每一個應用程序的組件及其屬性(如icon,label,permission等)
//用戶是否能選擇自行清除數據,默認為true,程序管理器包含一個選擇允許用戶清除數據。當為true時,用戶可自己清理用戶數據,反之亦然
<application android:allowClearUserData=["true" | "false"]
//是否允許activity更換從屬的任務,比如從短信息任務切換到瀏覽器任務
android:allowTaskReparenting=["true" | "false"]
//Android2.2中的一個新特性,設置該APP的備份,屬性值應該是一個完整的類名,如com.project.TestCase,此屬性並沒有默認值,並且類名必須得指定
android:backupAgent="string"
//從字面上就可以看出是什么作用的,當設置為true時,表明該APP在手機上可以被調試。默認為false,在false的情況下調試該APP,就會報以下錯誤:Device XXX requires that applic...
android:debuggable=["true" | "false"]
//此屬性為字符串資源,可以顯示給用戶
android:description="string resource"
//Android系統是否能夠實例化該應用程序的組件,如果為true,每個組件的enabled屬性決定那個組件是否可以被 enabled。如果為false,它覆蓋組件指定的值;所有組件都是disabled。
android:enabled=["true" | "false"]
//表示此APP是否包含任何的代碼,默認為true,若為false,則系統在運行組件時,不會去嘗試加載任何的APP代碼
android:hasCode=["true" | "false"]
//聲明整個APP的圖標,圖片一般都放在drawable文件夾下
android:icon="drawable resource"
android:killAfterRestore=["true" | "false"]
android:label="string resource"
android:manageSpaceActivity="string"
//應用程序所實現的Application子類的全名
android:name="string"
//設置許可名,這個屬性若在<application>上定義的話,給應用程序的所有組件設置許可的便捷方式,當然它是被各組件設置的許可名所覆蓋的
android:permission="string"
//該應用程序是否應該在任何時候都保持運行狀態,默認為false。因為應用程序通常不應該設置本標識,持續模式僅僅應該設置給某些系統應用程序才是有意義的
android:persistent=["true" | "false"]
//應用程序運行的進程名,它的默認值為<manifest>元素里設置的包名,當然每個組件都可以通過設置該屬性來覆蓋默認值
android:process="string"
//同樣也是android2.2的一個新特性,用來表明應用是否准備嘗試恢復所有的備份,甚至該備份是比當前設備上更要新的版本,默認是false
android:restoreAnyVersion=["true" | "false"]
//擁有相同的affinity的Activity理論上屬於相同的Task,應用程序默認的affinity的名字是<manifest>元素中設定的package名
android:taskAffinity="string"
//資源的風格,它定義了一個默認的主題風格給所有的activity,當然也可以在自己的theme里面去設置它,有點類似style
android:theme="resource or theme" >
< /application>
屬性:Activity
<activity android:allowTaskReparenting=["true" | "false"]
//是否保留狀態不變, 比如切換回home, 再從新打開,activity處於最后的狀態。比如一個瀏覽器擁有很多狀態(當打開了多個TAB的時候),用戶並不希望丟失這些狀態時,此時可將此屬性設置為true
android:alwaysRetainTaskState=["true" | "false"]
//比如 P 是 activity, Q 是被P 觸發的 activity, 然后返回Home, 重新啟動 P,是否顯示 Q
android:clearTaskOnLaunch=["true" | "false"]
//主要用來看手機方向改變的. android手機在旋轉后,layout會重新布局, 如何做到呢?
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "orientation", "screenLayout",
"fontScale", "uiMode"]
android:enabled=["true" | "false"]
//是否可被顯示在最近打開的activity列表里,默認是false
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
//當用戶重新啟動這個任務的時候,是否關閉已打開的activity,默認是false
android:finishOnTaskLaunch=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
//android:launchMode在多Activity開發中,有可能是自己應用之間的Activity跳轉,或者夾帶其他應用的可復用Activity。可能會希望跳轉到原來某個Activity實例,而不是產生大量重復的Activity。這需要為Activity配置特定 的加載模式,而不是使用默認的加載模式
Activity有四種加載模式:
standard、singleTop、singleTask、singleInstance(其中前兩個是一組、后兩個是一組),默認為standard
standard:就是intent將發送給新的實例,所以每次跳轉都會生成新的activity。
singleTop:也是發送新的實例,但不同standard的一點是,在請求的Activity正好位於棧頂時(配置成singleTop的Activity),不會構造新的實例
singleTask:和后面的singleInstance都只創建一個實例,當intent到來,需要創建設置為singleTask的Activity的時候,系統會檢查棧里面是否已經有該Activity的實例。如果有直接將intent發送給它。
android:launchMode=["multiple" | "singleTop" |
"singleTask" | "singleInstance"]
//是否允許多進程,默認是false
android:multiprocess=["true" | "false"]
android:name="string"
//當用戶從Activity上離開並且它在屏幕上不再可見時,Activity是否從Activity stack中清除並結束。默認是false。Activity不會留下歷史痕跡
android:noHistory=["true" | "false"]
android:permission="string"
android:process="string"
//android:screenOrientationactivity顯示的模式
默認為unspecified:由系統自動判斷顯示方向
landscape橫屏模式,寬度比高度大
portrait豎屏模式, 高度比寬度大
user模式,用戶當前首選的方向
behind模式:和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
sensor模式:有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換
nosensor模式:忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
//activity被銷毀或者成功重啟時是否保存狀態
android:stateNotNeeded=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
//activity主窗口與軟鍵盤的交互模式,可以用來避免輸入法面板遮擋問題,Android1.5后的一個新特性
1.當有焦點產生時,軟鍵盤是隱藏還是顯示
2.是否減少活動主窗口大小以便騰出空間放軟鍵盤
3.值的含義:
stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設置
stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity里的狀態,無論是隱藏還是顯示
stateHidden:用戶選擇activity時,軟鍵盤總是被隱藏
stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也總是被隱藏的
stateVisible:軟鍵盤通常是可見的
stateAlwaysVisible:用戶選擇activity時,軟鍵盤總是顯示的狀態
adjustUnspecified:默認設置,通常由系統自行決定是隱藏還是顯示
adjustResize:該Activity總是調整屏幕的大小以便留出軟鍵盤的空間
adjustPan:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
< /activity>
屬性:intent-filter
<intent-filter android:icon="drawable resource"
android:label="string resource"
android:priority="integer" >
<action />
<category />
<data />
</intent-filter>
intent-filter屬性
android:priority(解釋:有序廣播主要是按照聲明的優先級別,如A的級別高於B,那么,廣播先傳給A,再傳給B。優先級別就是用設置priority屬性來確定,范圍是從-1000~1000,數越大優先級別越高)
Intent filter內會設定的資料包括action,data與category三種。也就是說filter只會與intent里的這三種資料作對比動作
action屬性
action很簡單,只有android:name這個屬性。常見的android:name值為android.intent.action.MAIN,表明此activity是作為應用程序的入口。有關android:name具體有哪些值,可參照這個網址:http://hi.baidu.com/linghtway/blog/item/83713cc1c2d053170ff477a7.html
category屬性
category也只有android:name屬性。常見的android:name值為android.intent.category.LAUNCHER(決定應用程序是否顯示在程序列表里)
有關android:name具體有哪些值,可參照這個網址:http://chroya.javaeye.com/blog/685871
data屬性
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string"/>
【1】每個<data>元素指定一個URI和數據類型(MIME類型)。它有四個屬性scheme、host、port、path對應於URI的每個部分:
scheme://host:port/path
scheme的值一般為"http",host為包名,port為端口號,path為具體地址。如:http://com.test.project:200/folder/etc
其中host和port合起來構成URI的憑據(authority),如果host沒有指定,則port也會被忽略
要讓authority有意義,scheme也必須要指定。要讓path有意義,scheme+authority也必須要指定
【2】mimeType(指定數據類型),若mimeType為'Image',則會從content Provider的指定地址中獲取image類型的數據。還有'video'啥的,若設置為video/mp4,則表示在指定地址中獲取mp4格式的video文件
【3】而pathPattern和PathPrefix主要是為了格式化path所使用的
屬性:<meta-data>
<meta-data android:name="string"
android:resource="resource specification"
android:value="string"/>
該元素的基本結構,可以包含在<activity> <activity-alias> <service> <receiver>四個元素中。
android:name 解釋:元數據項的名字,為了保證這個名字是唯一的,采用java風格的命名規范,如com.woody.project.fried
android:resource 解釋:資源的一個引用,指定給這個項的值是該資源的id。該id可以通過方法Bundle.getInt()來從meta-data中找到。)
android:value 解釋:指定給這一項的值。可以作為值來指定的數據類型並且組件用來找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getString],[getBoolean]
屬性:<activity-alias>
<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">
< intent-filter/>
< meta-data/>
< /activity-alias>
<activity-alias>是為activity創建快捷方式的,如下實例:
< activity android:name=".shortcut">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<activity-alias android:name=".CreateShortcuts" android:targetActivity=".shortcut" android:label="@string/shortcut">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity-alias>
其中android.targetActivity是指向對應快捷方式的activity,如上述的shortcut(此Activity名)
android:label是指快捷方式的名稱,而快捷方式的圖標默認是給定的application圖標
屬性:<service>
【1】service與activity同級,與activity不同的是,它不能自己啟動的,運行在后台的程序,如果我們退出應用時,Service進程並沒有結束,它仍然在后台運行。比如聽音樂,網絡下載數據等,都是由service運行的
【2】service生命周期:Service只繼承了onCreate(),onStart(),onDestroy()三個方法,第一次啟動Service時,先后調用了onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy()方法,如果Service已經啟動了,當我們再次啟動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法
【3】service與activity間的通信
Service后端的數據最終還是要呈現在前端Activity之上的,因為啟動Service時,系統會重新開啟一個新的進程,這就涉及到不同進程間通信的問題了(AIDL),Activity與service間的通信主要用IBinder負責。具體可參照:http://zhangyan1158.blog.51cto.com/2487362/491358
【4】
<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>
receiver的屬性與service一樣,這里就不顯示了
BroadcastReceiver:用於發送廣播,broadcast是在應用程序之間傳輸信息的一種機制,而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件,具體參照http://kevin2562.javaeye.com/blog/686787
屬性:<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">
<grant-uri-permission/>
<meta-data/>
</provider>
contentProvider(數據存儲)
【1】android:authorities:
標識這個ContentProvider,調用者可以根據這個標識來找到它
【2】android:grantUriPermission:
對某個URI授予的權限
【3】android:initOrder
10、第三層<uses-library>
用戶庫,可自定義。所有android的包都可以引用
屬性:<supports-screens>
<supports-screens android:smallScreens=["true" | "false"]
android:normalScreens=["true" | "false"]
android:largeScreens=["true" | "false"]
android:anyDensity=["true" | "false"] />
這是在android1.6以后的新特性,支持多屏幕機制
各屬性含義:這四個屬性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多種不同密度
屬性:<uses-configuration />與<uses-feature>性能都差不多
<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:glEsVersion="integer"
android:name="string"
android:required=["true" | "false"] />
這兩者都是在描述應用所需要的硬件和軟件特性,以便防止應用在沒有這些特性的設備上安裝。
屬性:<uses-sdk />
<uses-sdk android:minSdkVersion="integer"
android:targetSdkVersion="integer"
android:maxSdkVersion="integer"/>
描述應用所需的api level,就是版本,目前是android 2.2 = 8,android2.1 = 7,android1.6 = 4,android1.5=3
在此屬性中可以指定支持的最小版本,目標版本以及最大版本
屬性:<instrumentation />
<instrumentation android:functionalTest=["true" | "false"]
android:handleProfiling=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:targetPackage="string"/>
定義一些用於探測和分析應用性能等等相關的類,可以監控程序。在各個應用程序的組件之前instrumentation類被實例化
android:functionalTest(解釋:instrumentation類是否能運行一個功能測試,默認為false)
屬性:<permission>、<uses-permission>、<permission-tree />、<permission-group />區別
最常用的當屬<uses-permission>,當我們需要獲取某個權限的時候就必須在我們的manifest文件中聲明,此<uses-permission>與<application>同級,具體權限列表請看此處
通常情況下我們不需要為自己的應用程序聲明某個權限,除非你提供了供其他應用程序調用的代碼或者數據。這個時候你才需要使用<permission> 這個標簽。很顯然這個標簽可以讓我們聲明自己的權限。比如:
<permission android:name="com.teleca.project.MY_SECURITY" . . . />
那么在activity中就可以聲明該自定義權限了,如:
< application . . .>
<activity android:name="XXX" . . . >
android:permission="com.teleca.project.MY_SECURITY"> </activity>
</application>
當然自己聲明的permission也不能隨意的使用,還是需要使用<uses-permission>來聲明你需要該權限
<permission-group> 就是聲明一個標簽,該標簽代表了一組permissions,而<permission-tree>是為一組permissions聲明了一個namespace。