android關於AndroidManifest.xml詳細分析【轉】

1、關於AndroidManifest.xml
AndroidManifest.xml 是每一個android程序中必須的文件。它位於整個項目的根目錄,描述了package中暴露的組件(activities, services, 等等),他們各自的實現類,各類能被處理的數據和啓動位置。 除了能聲明程序中的Activities, ContentProviders, Services, 和Intent Receivers,還能指定permissions和instrumentation(安全控制和測試)html

2、AndroidManifest.xml結構前端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xmlversion="1.0"encoding="utf-8"?>
<manifest>
    <application>
       <activity>
           <intent-filter>
               <action/>
               <category/>
           </intent-filter>
      </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/>
       </provider>
       <uses-library/>
    </application>
    <uses-permission/>
    <permission/>
    <permission-tree/>
    <permission-group/>
    <instrumentation/>
    <uses-sdk/>
    <uses-configuration/> 
    <uses-feature/> 
    <supports-screens/>
</manifest>

3、各個節點的詳細介紹
一、第一層():(屬性)java

1
2
3
4
5
6
7
8
<manifest  xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.woody.test"
          android:sharedUserId="string"
          android:sharedUserLabel="string resource"
          android:versionCode="integer"
          android:versionName="string"
          android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>

A、xmlns:android
定義android命名空間,通常爲 http://schemas.android.com/apk/res/android ,這樣使得Android中各類標準屬性能在文件中使用,提供了大部分元素中的數據。
B、package
指定本應用內java主程序包的包名,它也是一個應用進程的默認名稱
C、sharedUserId
代表數據權限,由於默認狀況下,Android給每一個APK分配一個惟一的UserID,因此是默認禁止不一樣APK訪問共享數據的。若要共享數據,第一能夠採用Share Preference方法,第二種就能夠採用sharedUserId了,將不一樣APK的sharedUserId都設爲同樣,則這些APK之間就能夠互相共享數據了。
Android給每一個APK進程分配一個單獨的用戶空間,其manifest中的userid就是對應一個Linux用戶(Android 系統是基於Linux)的.因此不一樣APK(用戶)間互相訪問數據默認是禁止的.可是它也提供了2種APK間共享數據的形式:
1. Share Preference. / Content Provider
APK能夠指定接口和數據給任何其餘APK讀取. 須要本身實現接口和Share的數據.
本文對於這個不作詳細解釋
2. Shared User id
經過Shared User id,擁有同一個User id的多個APK能夠配置成運行在同一個進程中.因此默認就是能夠互相訪問任意數據. 也能夠配置成運行成不一樣的進程, 同時能夠訪問其餘APK的數據目錄下的數據庫和文件.就像訪問本程序的數據同樣.好比某個公司開發了多個Android 程序, 那麼能夠把數據,圖片等資源集中放到APK A中去. 而後這個公司的全部APK都使用同一個User ID, 那麼全部的資源均可以從APK A中讀取.
舉個例子:
APK A 和APK B 都是C公司的產品,那麼若是用戶從APK A中登錄成功.那麼打開APK B的時候就不用
再次登錄. 具體實現就是 A和B設置成同一個User ID:
* 在2個APK的AndroidManifest.xml 配置User ID:android

1
2
3
  <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.demo.a1"
    android:sharedUserId="com.c">

這個"com.c" 就是user id, 而後packagename APK A就是上面的內容, APK B可能
是"com.android.demo.b1" 這個沒有限制web

這個設定好以後, APK B就能夠像打開本地數據庫那樣 打開APK A中的數據庫了.
APK A把登錄信息存放在A的數據目錄下面. APK B每次啓動的時候讀取APK A下面的數據庫
判斷是否已經登錄:
APK B中的代碼:數據庫

1
2
3
       friendContext = this.createPackageContext(
                    "com.android.demo.a1",
                    Context.CONTEXT_IGNORE_SECURITY);

經過A的package name 就能夠獲得A的 packagecontext
經過這個context就能夠直接打開數據庫
D、sharedUserLabel
一個共享的用戶名,它只有在設置了sharedUserId屬性的前提下才會有意義
E、versionCode
是給設備程序識別版本(升級)用的必須是一個interger值表明app更新過多少次,好比初版通常爲1,以後若要更新版本就設置爲2,3等等。。。
F、versionName
這個名稱是給用戶看的,你能夠將你的APP版本號設置爲1.1版,後續更新版本設置爲1.二、2.0版本等等。。。
G、installLocation
安裝參數,是Android2.2中的一個新特性,installLocation有三個值能夠選擇:internalOnly、auto、preferExternal
選擇preferExternal,系統會優先考慮將APK安裝到SD卡上(固然最終用戶能夠選擇爲內部ROM存儲上,若是SD存儲已滿,也會安裝到內部存儲上)
選擇auto,系統將會根據存儲空間本身去適應
選擇internalOnly是指必須安裝到內部才能運行
(注:須要進行後臺類監控的APP最好安裝在內部,而一些較大的遊戲APP最好安裝在SD卡上。現默認爲安裝在內部,若是把APP安裝在SD卡上,首先得設置你的level爲8,而且要配置android:installLocation這個參數的屬性爲preferExternal)後端

二、第二層():屬性
一個AndroidManifest.xml中必須含有一個Application標籤,這個標籤聲明瞭每個應用程序的組件及其屬性(如icon,label,permission等)api

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<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>

A、android:allowClearUserData('true' or 'false')
用戶是否能選擇自行清除數據,默認爲true,程序管理器包含一個選擇容許用戶清除數據。當爲true時,用戶可本身清理用戶數據,反之亦然
B、android:allowTaskReparenting('true' or 'false')
是否容許activity更換從屬的任務,好比從短信息任務切換到瀏覽器任務
C、android:backupAgent
這也是Android2.2中的一個新特性,設置該APP的備份,屬性值應該是一個完整的類名,如com.project.TestCase,此屬性並無默認值,而且類名必須得指定(就是個備份工具,將數據備份到雲端的操做)
D、android:debuggable
這個從字面上就能夠看出是什麼做用的,當設置爲true時,代表該APP在手機上能夠被調試。默認爲false,在false的狀況下調試該APP,就會報如下錯誤:
Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.
Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.
E、android:description/android:label
此兩個屬性都是爲許可提供的,均爲字符串資源,當用戶去看許可列表(android:label)或者某個許可的詳細信息(android:description)時,這些字符串資源就能夠顯示給用戶。label應當儘可能簡短,之須要告知用戶該許但是在保護什麼功能就行。而description能夠用於具體描述獲取該許可的程序能夠作哪些事情,實際上讓用戶能夠知道若是他們贊成程序獲取該權限的話,該程序能夠作什麼。咱們一般用兩句話來描述許可,第一句描述該許可,第二句警告用戶若是批准該權限會可能有什麼很差的事情發生
F、android:enabled
Android系統是否可以實例化該應用程序的組件,若是爲true,每一個組件的enabled屬性決定那個組件是否能夠被 enabled。若是爲false,它覆蓋組件指定的值;全部組件都是disabled。
G、android:hasCode('true' or 'false')
表示此APP是否包含任何的代碼,默認爲true,若爲false,則系統在運行組件時,不會去嘗試加載任何的APP代碼
一個應用程序自身不會含有任何的代碼,除非內置組件類,好比Activity類,此類使用了AliasActivity類,固然這是個罕見的現象
(在Android2.3能夠用標準C來開發應用程序,可在androidManifest.xml中將此屬性設置爲false,由於這個APP自己已經不含有任何的JAVA代碼了)
H、android:icon
這個很簡單,就是聲明整個APP的圖標,圖片通常都放在drawable文件夾下
I、android:killAfterRestore
是否復位須要重啓
J、android:manageSpaceActivity
讓應用手動管理應用的數據目錄
K、android:name
爲應用程序所實現的Application子類的全名。當應用程序進程開始時,該類在全部應用程序組件以前被實例化。
若該類(比方androidMain類)是在聲明的package下,則能夠直接聲明android:name="androidMain",但此類是在package下面的子包的話,就必須聲明爲全路徑或android:name="package名稱.子包名成.androidMain"
L、android:permission
設置許可名,這個屬性若在上定義的話,是一個給應用程序的全部組件設置許可的便捷方式,固然它是被各組件設置的許可名所覆蓋的
M、android:presistent
該應用程序是否應該在任什麼時候候都保持運行狀態,默認爲false。由於應用程序一般不該該設置本標識,持續模式僅僅應該設置給某些系統應用程序纔是有意義的。
N、android:process
應用程序運行的進程名,它的默認值爲元素裏設置的包名,固然每一個組件均可以經過設置該屬性來覆蓋默認值。若是你想兩個應用程序共用一個進程的話,你能夠設置他們的android:process相同,但前提條件是他們共享一個用戶ID及被賦予了相同證書的時候
O、android:restoreAnyVersion
一樣也是android2.2的一個新特性,用來代表應用是否準備嘗試恢復全部的備份,甚至該備份是比當前設備上更要新的版本,默認是false
P、android:taskAffinity
擁有相同的affinity的Activity理論上屬於相同的Task,應用程序默認的affinity的名字是元素中設定的package名
Q、android:theme
是一個資源的風格,它定義了一個默認的主題風格給全部的activity,固然也能夠在本身的theme裏面去設置它,有點相似style。瀏覽器

三、第三層():屬性安全

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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: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>

(注:有些在application中重複的就很少闡述了)
A、android:alwaysRetainTaskState
是否保留狀態不變, 好比切換回home, 再重新打開,activity處於最後的狀態。好比一個瀏覽器擁有不少狀態(當打開了多個TAB的時候),用戶並不但願丟失這些狀態時,此時可將此屬性設置爲true
B、android:clearTaskOnLaunch
好比 P 是 activity, Q 是被P 觸發的 activity, 而後返回Home, 從新啓動 P,是否顯示 Q
C、android:configChanges
當配置list發生修改時, 是否調用 onConfigurationChanged() 方法 好比 "locale|navigation|orientation". 這個我用過,主要用來看手機方向改變的. android手機在旋轉後,layout會從新佈局, 如何作到呢?正常狀況下. 若是手機旋轉了.當前Activity後殺掉,而後根據方向從新加載這個Activity. 就會從onCreate開始從新加載.若是你設置了 這個選項, 當手機旋轉後,當前Activity以後調用onConfigurationChanged() 方法. 而不跑onCreate方法等.
D、android:excludeFromRecents
是否可被顯示在最近打開的activity列表裏,默認是false
E、android:finishOnTaskLaunch
當用戶從新啓動這個任務的時候,是否關閉已打開的activity,默認是false若是這個屬性和allowTaskReparenting都是true,這個屬性就是王牌。Activity的親和力將被忽略。該Activity已經被摧毀並不是re-parented
F、android:launchMode(Activity加載模式)
在多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發送給它。
singleInstance:首先說明一下task這個概念,Task能夠認爲是一個棧,可放入多個Activity。好比啓動一個應用,那麼Android就建立了一個Task,而後啓動這個應用的入口Activity,那在它的界面上調用其餘的Activity也只是在這個task裏面。那若是在多個task中共享一個Activity的話怎麼辦呢。舉個例來講,若是開啓一個導遊服務類的應用程序,裏面有個Activity是開啓GOOGLE地圖的,當按下home鍵退回到主菜單又啓動GOOGLE地圖的應用時,顯示的就是剛纔的地圖,其實是同一個Activity,實際上這就引入了singleInstance。singleInstance模式就是將該Activity單獨放入一個棧中,這樣這個棧中只有這一個Activity,不一樣應用的intent都由這個Activity接收和展現,這樣就作到了共享。固然前提是這些應用都沒有被銷燬,因此剛纔是按下的HOME鍵,若是按下了返回鍵,則無效
G、android:multiprocess
是否容許多進程,默認是false
在實際開發中,CP有如下兩種用法:
1)和應用在一個APK包裏
這種狀況下和應用在同一進程中。process name和uid都同樣。
2)單獨在一個APK包裏。
這種狀況下,若是在AndroidManifest.xml文件裏聲明瞭和某個進程同屬一個進程,如:

1
2
3
4
5
6
7
package="com.android.providers.telephony"
android:sharedUserId="android.uid.phone">                
android:allowClearUserData="false"                 
android:label="Dialer Storage"                 
android:icon="@drawable/ic_launcher_phone">  
android:authorities="telephony" 
android:multiprocess="true" />

這個裏面經過android:sharedUserId="android.uid.phone"和android:process="com.android.phone"聲明瞭該CP是和phone進程同屬一個進程,擁有一樣的process name和uid.
若是沒有上述聲明,那麼該CP是在獨立的進程中,擁有屬於本身的process name和uid.
以上兩種用法能夠總結爲:
1)CP和某個進程同屬一個進程
這種狀況下,當該進程啓動時,會搜索屬於該進程的全部CP,並加載。
2)CP屬於獨立的一個進程。
這種狀況下,只有須要用到該CP時,纔會去加載。
那麼,當一個進程想要操做一個CP時,先須要獲取該CP的對象,系統是如何處理呢:
1)若是該CP屬於當前主叫進程,由於在進程啓動時就已經加載過了,因此係統會直接返回該CP的對象。
2)若是該CP不屬於當前主叫進程,那麼系統會進行相關處理(由ActivityManagerService進行,如下簡稱爲AMS):
全部已加載的CP信息都已保存在AMS中。當須要獲取某個CP的對象時,AMS會先判斷該CP是否已被加載
----若是已被加載,該CP和當前主叫進程不屬一個進程,可是該CP設置了multiprocess的屬性(如上例中的android:multiprocess="true"),而且該CP屬於系統級CP,那麼就在當前主叫進程內部新生成該CP的對象。不然就須要經過IPC機制進行調用。
----若是還未被加載,該CP和當前主叫進程不屬一個進程,可是該CP設置了multiprocess的屬性(如上例中的android:multiprocess="true"),而且該CP屬於系統級CP,那麼就在當前主叫進程內部新生成該CP的對象。不然就須要先建立該CP所在的進程,而後再經過IPC機制進行調用。
H、android:noHistory
當用戶從Activity上離開而且它在屏幕上再也不可見時,Activity是否從Activity stack中清除並結束。默認是false。Activity不會留下歷史痕跡
I、android:screenOrientation
activity顯示的模式
默認爲unspecified:由系統自動判斷顯示方向
landscape橫屏模式,寬度比高度大
portrait豎屏模式, 高度比寬度大
user模式,用戶當前首選的方向
behind模式:和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
sensor模式:有物理的感應器來決定。若是用戶旋轉設備這屏幕會橫豎屏切換
nosensor模式:忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了
J、android:stateNotNeeded
activity被銷燬或者成功重啓時是否保存狀態
K、android:windowSoftInputMode
activity主窗口與軟鍵盤的交互模式,能夠用來避免輸入法面板遮擋問題,Android1.5後的一個新特性。
這個屬性能影響兩件事情:
【A】當有焦點產生時,軟鍵盤是隱藏仍是顯示
【B】是否減小活動主窗口大小以便騰出空間放軟鍵盤
各值的含義:
【A】stateUnspecified:軟鍵盤的狀態並無指定,系統將選擇一個合適的狀態或依賴於主題的設置
【B】stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裏的狀態,不管是隱藏仍是顯示
【C】stateHidden:用戶選擇activity時,軟鍵盤老是被隱藏
【D】stateAlwaysHidden:當該Activity主窗口獲取焦點時,軟鍵盤也老是被隱藏的
【E】stateVisible:軟鍵盤一般是可見的
【F】stateAlwaysVisible:用戶選擇activity時,軟鍵盤老是顯示的狀態
【G】adjustUnspecified:默認設置,一般由系統自行決定是隱藏仍是顯示
【H】adjustResize:該Activity老是調整屏幕的大小以便留出軟鍵盤的空間
【I】adjustPan:當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能老是看到輸入內容的部分

四、第四層()
結構圖:

1
2
3
4
5
6
7
<intent-filter  android:icon="drawable resource"
               android:label="string resource"
               android:priority="integer" >
      <action />
      <category />
      <data />
</intent-filter> 

A、intent-filter屬性
android:priority(解釋:有序廣播主要是按照聲明的優先級別,如A的級別高於B,那麼,廣播先傳給A,再傳給B。優先級別就是用設置priority屬性來肯定,範圍是從-1000~1000,數越大優先級別越高)Intent filter內會設定的資料包括action,data與category三種。也就是說filter只會與intent裏的這三種資料做對比動做
B、action屬性
action很簡單,只有android:name這個屬性。常見的android:name值爲android.intent.action.MAIN,代表此activity是做爲應用程序的入口。

有關android:name的具體值:
String ADD_SHORTCUT_ACTION 動做:
在系統中添加一個快捷方式。
"android.intent.action.ADD_SHORTCUT" String ALL_APPS_ACTION 動做:
列舉全部可用的應用。
"android.intent.action.ALL_APPS" String ALTERNATIVE_CATEGORY 類別:
說明 activity 是用戶正在瀏覽的數據的一個可選操做。輸入:無。
"android.intent.category.ALTERNATIVE" String ANSWER_ACTION 動做:
處理撥入的電話。
"android.intent.action.ANSWER" String BATTERY_CHANGED_ACTION 廣播:
充電狀態,或者電池的電量發生變化。
"android.intent.action.BATTERY_CHANGED" String BOOT_COMPLETED_ACTION 廣播:
在系統啓動後,這個動做被廣播一次(只有一次)。
"android.intent.action.BOOT_COMPLETED" String BROWSABLE_CATEGORY 類別:
可以被瀏覽器安全使用的 activities 必須支持這個類別。
"android.intent.category.BROWSABLE" String BUG_REPORT_ACTION 動做:
顯示 activity 報告錯誤。
"android.intent.action.BUG_REPORT" String CALL_ACTION 動做:
撥打電話,被呼叫的聯繫人在數據中指定。
"android.intent.action.CALL" String CALL_FORWARDING_STATE_CHANGED_ACTION 廣播:
語音電話的呼叫轉移狀態已經改變。
"android.intent.action.CFF" String CLEAR_CREDENTIALS_ACTION 動做:
清除登錄憑證 (credential)。
"android.intent.action.CLEAR_CREDENTIALS" String CONFIGURATION_CHANGED_ACTION 廣播:
設備的配置信息已經改變。
String DATA_ACTIVITY_STATE_CHANGED_ACTION 廣播:
電話的數據活動(data activity)狀態(即收發數據的狀態)已經改變。 "android.intent.action.DATA_ACTIVITY" String DATA_CONNECTION_STATE_CHANGED_ACTION 廣播:電話的數據鏈接狀態已經改變。
"android.intent.action.DATA_STATE" String DATE_CHANGED_ACTION 廣播:
日期被改變。
"android.intent.action.DATE_CHANGED" String DEFAULT_ACTION 動做:
和 VIEW_ACTION 相同,是在數據上執行的標準動做。
"android.intent.action.VIEW" String DEFAULT_CATEGORY 類別:
若是 activity 是對數據執行確省動做(點擊, center press)的一個選項,須要設置這個類別。 "android.intent.category.DEFAULT" String DELETE_ACTION 動做:
從容器中刪除給定的數據。
"android.intent.action.DELETE" String DEVELOPMENT_PREFERENCE_CATEGORY 類別:
說明 activity 是一個設置面板 (development preference panel). "android.intent.category.DEVELOPMENT_PREFERENCE" String DIAL_ACTION 動做:
撥打數據中指定的電話號碼。
"android.intent.action.DIAL String EDIT_ACTION 動做:
爲制定的數據顯示可編輯界面。
"android.intent.action.EDIT" String EMBED_CATEGORY 類別:
可以在上級(父)activity 中運行。
"android.intent.category.EMBED" String EMERGENCY_DIAL_ACTION 動做:
撥打緊急電話號碼。
"android.intent.action.EMERGENCY_DIAL" int FORWARD_RESULT_LAUNCH 啓動標記:
若是這個標記被設置,並且被一個已經存在的 activity 用來啓動新的 activity,已有 activity 的回覆目標 (reply target) 會被轉移給新的 activity。
16 0x00000010 String FOTA_CANCEL_ACTION 廣播:
取消全部被掛起的 (pending) 更新下載。
"android.server.checkin.FOTA_CANCEL" String FOTA_INSTALL_ACTION 廣播:
更新已經被確認,立刻就要開始安裝。
"android.server.checkin.FOTA_INSTALL" String FOTA_READY_ACTION 廣播:
更新已經被下載,能夠開始安裝。
"android.server.checkin.FOTA_READY" String FOTA_RESTART_ACTION 廣播:
恢復已經中止的更新下載。
"android.server.checkin.FOTA_RESTART" String FOTA_UPDATE_ACTION 廣播:
經過 OTA 下載並安裝操做系統更新。
"android.server.checkin.FOTA_UPDATE" String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 類別:
做爲代碼框架下儀器的測試。
"android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" String GADGET_CATEGORY 類別:這個 activity 能夠被嵌入宿主 activity (activity that is hosting gadgets)。 "android.intent.category.GADGET" String GET_CONTENT_ACTION 動做:
讓用戶選擇數據並返回。
"android.intent.action.GET_CONTENT" String HOME_CATEGORY 類別:
主屏幕 (activity),設備啓動後顯示的第一個 activity。
"android.intent.category.HOME" String INSERT_ACTION 動做:
在容器中插入一個空項 (item)。
"android.intent.action.INSERT" String INTENT_EXTRA 附加數據:
和PICK_ACTIVITY_ACTION 一塊兒使用時,說明用戶選擇的用來顯示的 activity;
和ADD_SHORTCUT_ACTION 一塊兒使用的時候,描述要添加的快捷方式。 "android.intent.extra.INTENT" String LABEL_EXTRA 附加數據:
大寫字母開頭的字符標籤,和 ADD_SHORTCUT_ACTION 一塊兒使用。
"android.intent.extra.LABEL" String LAUNCHER_CATEGORY 類別:
Activity 應該被顯示在頂級的launcher 中。
"android.intent.category.LAUNCHER" String LOGIN_ACTION 動做:
獲取登陸憑證。
"android.intent.action.LOGIN" String MAIN_ACTION 動做:
做爲主入口點啓動,不須要數據。
"android.intent.action.MAIN" String MEDIABUTTON_ACTION 廣播:
用戶按下了「Media Button」。
"android.intent.action.MEDIABUTTON" String MEDIA_BAD_REMOVAL_ACTION 廣播:
擴展介質(擴展卡)已經從 SD 卡插槽拔出,可是掛載點 (mount point) 還沒解除 (unmount)。 "android.intent.action.MEDIA_BAD_REMOVAL" String MEDIA_EJECT_ACTION 廣播:
用戶想要移除擴展介質(拔掉擴展卡)。
"android.intent.action.MEDIA_EJECT" String MEDIA_MOUNTED_ACTION 廣播:
擴展介質被插入,並且已經被掛載。
"android.intent.action.MEDIA_MOUNTED" String MEDIA_REMOVED_ACTION 廣播:
擴展介質被移除。
"android.intent.action.MEDIA_REMOVED" String MEDIA_SCANNER_FINISHED_ACTION 廣播:
已經掃描完介質的一個目錄。
"android.intent.action.MEDIA_SCANNER_FINISHED" String MEDIA_SCANNER_STARTED_ACTION 廣播:
開始掃描介質的一個目錄。
"android.intent.action.MEDIA_SCANNER_STARTED" String MEDIA_SHARED_ACTION 廣播:
擴展介質的掛載被解除 (unmount),由於它已經做爲 USB 大容量存儲被共享。 "android.intent.action.MEDIA_SHARED" String MEDIA_UNMOUNTED_ACTION 廣播:
擴展介質存在,可是尚未被掛載 (mount)。
"android.intent.action.MEDIA_UNMOUNTED" String MESSAGE_WAITING_STATE_CHANGED_ACTION 廣播:
電話的消息等待(語音郵件)狀態已經改變。
"android.intent.action.MWI" int MULTIPLE_TASK_LAUNCH 啓動標記:
和 NEW_TASK_LAUNCH 聯合使用,禁止將已有的任務改變爲前景任務 (foreground)。
8 0x00000008 String NETWORK_TICKLE_RECEIVED_ACTION 廣播:
設備收到了新的網絡 "tickle" 通知。
"android.intent.action.NETWORK_TICKLE_RECEIVED" int NEW_TASK_LAUNCH 啓動標記:
設置之後,activity 將成爲歷史堆棧中的第一個新任務(棧頂)。
4 0x00000004 int NO_HISTORY_LAUNCH 啓動標記:
設置之後,新的 activity 不會被保存在歷史堆棧中。
1 0x00000001 String PACKAGE_ADDED_ACTION 廣播:
設備上新安裝了一個應用程序包。
"android.intent.action.PACKAGE_ADDED" String PACKAGE_REMOVED_ACTION 廣播:
設備上刪除了一個應用程序包。
"android.intent.action.PACKAGE_REMOVED" String PHONE_STATE_CHANGED_ACTION 廣播:
電話狀態已經改變。
"android.intent.action.PHONE_STATE" String PICK_ACTION 動做:
從數據中選擇一個項目 (item),將被選中的項目返回。
"android.intent.action.PICK" String PICK_ACTIVITY_ACTION 動做:
選擇一個activity,返回被選擇的 activity 的類(名)。
"android.intent.action.PICK_ACTIVITY" String PREFERENCE_CATEGORY 類別:
activity是一個設置面板 (preference panel)。
"android.intent.category.PREFERENCE" String PROVIDER_CHANGED_ACTION 廣播:
更新將要(真正)被安裝。
"android.intent.action.PROVIDER_CHANGED" String PROVISIONING_CHECK_ACTION 廣播:
要求 polling of provisioning service 下載最新的設置。 "android.intent.action.PROVISIONING_CHECK" String RUN_ACTION 動做:
運行數據(指定的應用),不管它(應用)是什麼。
"android.intent.action.RUN" String SAMPLE_CODE_CATEGORY 類別:
做爲一個示例代碼例子(不是普通用戶體驗的一部分)。 "android.intent.category.SAMPLE_CODE" String SCREEN_OFF_ACTION 廣播:
屏幕被關閉。
"android.intent.action.SCREEN_OFF" String SCREEN_ON_ACTION 廣播:
屏幕已經被打開。
"android.intent.action.SCREEN_ON" String SELECTED_ALTERNATIVE_CATEGORY 類別:
對於被用戶選中的數據,activity 是它的一個可選操做。 "android.intent.category.SELECTED_ALTERNATIVE" String SENDTO_ACTION 動做:
向 data 指定的接收者發送一個消息。
"android.intent.action.SENDTO" String SERVICE_STATE_CHANGED_ACTION 廣播:
電話服務的狀態已經改變。
"android.intent.action.SERVICE_STATE" String SETTINGS_ACTION 動做:
顯示系統設置。輸入:無。
"android.intent.action.SETTINGS" String SIGNAL_STRENGTH_CHANGED_ACTION 廣播:
電話的信號強度已經改變。
"android.intent.action.SIG_STR" int SINGLE_TOP_LAUNCH 啓動標記:
設置之後,若是 activity 已經啓動,並且位於歷史堆棧的頂端,將再也不啓動(不從新啓動) activity。 2 0x00000002 String STATISTICS_REPORT_ACTION 廣播:
要求 receivers 報告本身的統計信息。
"android.intent.action.STATISTICS_REPORT" String STATISTICS_STATE_CHANGED_ACTION 廣播:
統計信息服務的狀態已經改變。
"android.intent.action.STATISTICS_STATE_CHANGED" String SYNC_ACTION 動做:
執行數據同步。
"android.intent.action.SYNC" String TAB_CATEGORY 類別:
這個 activity 應該在 TabActivity 中做爲一個 tab 使用。
"android.intent.category.TAB" String TEMPLATE_EXTRA 附加數據:
新記錄的初始化模板。
"android.intent.extra.TEMPLATE" String TEST_CATEGORY 類別:
做爲測試目的使用,不是正常的用戶體驗的一部分。
"android.intent.category.TEST" String TIMEZONE_CHANGED_ACTION 廣播:
時區已經改變。
"android.intent.action.TIMEZONE_CHANGED" String TIME_CHANGED_ACTION 廣播:
時間已經改變(從新設置)。
"android.intent.action.TIME_SET" String TIME_TICK_ACTION 廣播:
當前時間已經變化(正常的時間流逝)。
"android.intent.action.TIME_TICK" String UMS_CONNECTED_ACTION 廣播:
設備進入 USB 大容量存儲模式。
"android.intent.action.UMS_CONNECTED" String UMS_DISCONNECTED_ACTION 廣播:
設備從 USB 大容量存儲模式退出。
"android.intent.action.UMS_DISCONNECTED" String UNIT_TEST_CATEGORY 類別:
應該被用做單元測試(經過 test harness 運行)。
"android.intent.category.UNIT_TEST" String VIEW_ACTION 動做:
向用戶顯示數據。
"android.intent.action.VIEW" String WALLPAPER_CATEGORY 類別:
這個 activity 能過爲設備設置牆紙。
"android.intent.category.WALLPAPER" String WALLPAPER_CHANGED_ACTION 廣播:
系統的牆紙已經改變。
"android.intent.action.WALLPAPER_CHANGED" String WALLPAPER_SETTINGS_ACTION 動做:
顯示選擇牆紙的設置界面。輸入:無。
"android.intent.action.WALLPAPER_SETTINGS" String WEB_SEARCH_ACTION 動做:
執行 web 搜索。
"android.intent.action.WEB_SEARCH" String XMPP_CONNECTED_ACTION 廣播:
XMPP 鏈接已經被創建。
"android.intent.action.XMPP_CONNECTED" String XMPP_DISCONNECTED_ACTION 廣播:
XMPP 鏈接已經被斷開。

C、category屬性
category也只有android:name屬性。常見的android:name值android.intent.category.LAUNCHER(決定應用程序是否顯示在程序列表裏)
有關android:name具體的值:
CATEGORY_ALTERNATIVE

設置這個activity是否能夠被認爲是用戶正在瀏覽的數據的一個可選擇的action

CATEGORY_APP_BROWSER

和ACTION_MAIN一塊兒使用,用來啓動瀏覽器應用程序

CATEGORY_APP_CALCULATOR

和ACTION_MAIN一塊兒使用,用來啓動計算器應用程序

CATEGORY_APP_CALENDAR

和ACTION_MAIN一塊兒使用,用來啓動日曆應用程序

CATEGORY_APP_CONTACTS

和ACTION_MAIN一塊兒使用,用來啓動聯繫人應用程序

CATEGORY_APP_EMAIL

和ACTION_MAIN一塊兒使用,用來啓動郵件應用程序

CATEGORY_APP_GALLERY

和ACTION_MAIN一塊兒使用,用來啓動圖庫應用程序

CATEGORY_APP_MAPS

和ACTION_MAIN一塊兒使用,用來啓動地圖應用程序

CATEGORY_APP_MARKET

這個activity容許用戶瀏覽和下載新的應用程序

CATEGORY_APP_MESSAGING

和ACTION_MAIN一塊兒使用,用來啓動短信應用程序

CATEGORY_APP_MUSIC

和ACTION_MAIN一塊兒使用,用來啓動音樂應用程序

CATEGORY_BROWSABLE

可以被瀏覽器安全調用的activity必須支持這個category

CATEGORY_DEFAULT

設置這個activity對於默認的action是不是一個可選的

CATEGORY_EMBED

能夠運行在父activity容器內

CATEGORY_HOME

主activity,當應用程序啓動時,它是第一個顯示的activity

CATEGORY_LAUNCHER

應該在上層的啓動列表裏顯示

CATEGORY_MONKEY

這個activity可能被monkey或者其餘的自動測試工具執行

CATEGORY_OPENABLE

用來指示一個GET_CONTENT意圖只但願ContentResolver.openInputStream可以打開URI

CATEGORY_PREFERENCE

這個activity是一個選項卡

CATEGORY_SAMPLE_CODE

做爲一個簡單的代碼示例使用(通常狀況下不使用)

CATEGORY_SELECTED_ALTERNATIVE

設置這個activity是否能夠被認爲是用戶當前選擇的數據的一個可選擇的action

CATEGORY_TAB

想要在已有的TabActivity內部做爲一個Tab使用

CATEGORY_TEST

供測試使用(通常狀況不使用)

CATEGORY_UNIT_TEST

聯合測試使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
Ddata屬性
<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類型)。
它有四個屬性schemehostportpath對應於URI的每一個部分: 
scheme://host:port/path
scheme的值通常爲"http"host爲包名,port爲端口號,path爲具體地址。如:http://com.test.project:200/folder/etc
其中hostport合起來構成URI的憑據(authority),若是host沒有指定,則port也會被忽略
要讓authority有意義,scheme也必需要指定。要讓path有意義,scheme+authority也必需要指定
2mimeType(指定數據類型),若mimeType爲'Image',則會從content Provider的指定地址中獲取image類型的數據。還有'video'啥的,若設置爲video/mp4,則表示在指定地址中獲取mp4格式的video文件
3】而pathPatternPathPrefix主要是爲了格式化path所使用的


```java
5、第四層<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]


```java
6、第三層<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圖標


```java
7、第三層<service>


```【1serviceactivity同級,與activity不一樣的是,它不能本身啓動的,運行在後臺的程序,若是咱們退出應用時,Service進程並無結束,它仍然在後臺運行。好比聽音樂,網絡下載數據等,都是由service運行的
2service生命週期:Service只繼承了onCreate(),onStart(),onDestroy()三個方法,第一次啓動Service時,前後調用了onCreate(),onStart()這兩個方法,當中止Service時,則執行onDestroy()方法,若是Service已經啓動了,當咱們再次啓動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法
3serviceactivity間的通訊
Service後端的數據最終仍是要呈如今前端Activity之上的,由於啓動Service時,系統會從新開啓一個新的進程,這就涉及到不一樣進程間通訊的問題了(AIDL)Activityservice間的通訊主要用IBinder負責。
4

```java
<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>

service標籤內的屬性以前已有描述,在此不重複了~

1
8、第三層<receiver>

receiver的屬性與service同樣,這裏就不顯示了
BroadcastReceiver:用於發送廣播,broadcast是在應用程序之間傳輸信息的一種機制,而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件Android BroadcastReceiver 簡介
在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver
活動(Activity) - 用於表現功能

服務(Service) - 至關於後臺運行的 Activity
廣播(Broadcast) - 用於發送廣播

廣播接收器(BroadcastReceiver) - 用於接收廣播
Intent - 用於鏈接以上各個組件,並在其間傳遞消息
BroadcastReceiver
在Android中,Broadcast是一種普遍運用的在應用程序之間傳輸信息的機制。而BroadcastReceiver是對發送出來的 Broadcast進行過濾接受並響應的一類組件。下面將詳細的闡述如何發送Broadcast和使用BroadcastReceiver過 濾接收的過程:
首先在須要發送信息的地方,把要發送的信息和用於過濾的信息(如Action、Category)裝入一個Intent對象,而後經過調用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent對象以廣播方式發送出去。
當Intent發送之後,全部已經註冊的BroadcastReceiver會檢查註冊時的IntentFilter是否與發送的Intent相匹配,若 匹配則就會調用BroadcastReceiver的onReceive()方法。因此當咱們定義一個BroadcastReceiver的時候,都須要 實現onReceive()方法。

註冊BroadcastReceiver有兩種方式:
一種方式是,靜態的在AndroidManifest.xml中用標籤生命註冊,並在標籤內用標籤設置過濾器。
另外一種方式是,動態的在代碼中先定義並設置好一個 IntentFilter對象,而後在須要註冊的地方調 Context.registerReceiver()方法,若是取消時就調用Context.unregisterReceiver()方法。若是用動 態方式註冊的BroadcastReceiver的Context對象被銷燬時,BroadcastReceiver也就自動取消註冊了。
另外,若在使用sendBroadcast()的方法是指定了接收權限,則只有在AndroidManifest.xml中用標籤聲明瞭擁有此權限的BroascastReceiver纔會有可能接收到發送來的Broadcast。
一樣,若在註冊BroadcastReceiver時指定了可接收的Broadcast的權限,則只有在包內的AndroidManifest.xml中 用標籤聲明瞭,擁有此權限的Context對象所發送的Broadcast才能被這個 BroadcastReceiver所接收。
動態註冊:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(String);--爲 BroadcastReceiver指定action,使之用於接收同action的廣播 registerReceiver(BroadcastReceiver,intentFilter);
通常:在onStart中註冊,onStop中取消unregisterReceiver
發送廣播消息:extends Service
指定廣播目標Action:Intent Intent = new Intent(action-String)
--指定了此action的receiver會接收此廣播
需傳遞參數(可選) putExtra();
發送:sendBroadcast(Intent);

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
9、第三層<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(數據存儲)
1android:authorities
標識這個ContentProvider,調用者能夠根據這個標識來找到它
2android:grantUriPermission
對某個URI授予的權限
3android:initOrder


```java
10、第三層<uses-library>


```用戶庫,可自定義。全部android的包均可以引用


```java
11、第一層<supports-screens>
<supports-screens  android:smallScreens=["true" | "false"] 
                  android:normalScreens=["true" | "false"] 
                  android:largeScreens=["true" | "false"] 
                  android:anyDensity=["true" | "false"] />


```這是在android1.6之後的新特性,支持多屏幕機制各屬性含義:這四個屬性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多種不一樣密度


```java
12、第二層<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"] />


```這二者都是在描述應用所須要的硬件和軟件特性,以便防止應用在沒有這些特性的設備上安裝。


```java
13、第二層<uses-sdk />
<uses-sdk android:minSdkVersion="integer"
          android:targetSdkVersion="integer"
          android:maxSdkVersion="integer"/>


```描述應用所需的api level,就是版本,目前是android 2.2 = 8android2.1 = 7android1.6 = 4android1.5=3在此屬性中能夠指定支持的最小版本,目標版本以及最大版本


```java
14、第二層<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)


```java
15<permission><uses-permission><permission-tree /><permission-group />區別

最經常使用的當屬,當咱們須要獲取某個權限的時候就必須在咱們的manifest文件中聲明,此與同級,具體權限列表請看此處
一般狀況下咱們不須要爲本身的應用程序聲明某個權限,除非你提供了供其餘應用程序調用的代碼或者數據。這個時候你才須要使用 這個標籤。很顯然這個標籤可讓咱們聲明本身的權限。好比:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<permission android:name="com.teleca.project.MY_SECURITY" . . . />


```那麼在activity中就能夠聲明該自定義權限了,如:

```java
<application . . .>
        <activity android:name="XXX" . . . >
                  android:permission="com.teleca.project.MY_SECURITY"> </activity>
 </application>

固然本身聲明的permission也不能隨意的使用,仍是須要使用來聲明你須要該權限
就是聲明一個標籤,該標籤表明了一組permissions,而是爲一組permissions聲明瞭一個namespace。這兩個標籤能夠看以前的系列文章。

原文做者: 冷風の傲

原文地址: http://my.eoe.cn/1087692/archive/5927.html

2013-08-01 16:20:04

相關文章
相關標籤/搜索