1. 程式人生 > >AndroidManifest.xml一些屬性介紹

AndroidManifest.xml一些屬性介紹

首先說明一下task這個概念,Task可以認為是一個棧,可放入多個Activity。比如啟動一個應用,那麼Android就建立了一個Task,然後啟動這個應用的入口Activity,那在它的介面上呼叫其他的Activity也只是在這個task裡面。那如果在多個task中共享一個Activity的話怎麼辦呢。舉個例來說,如果開啟一個導遊服務類的應用程式,裡面有個Activity是開啟GOOGLE地圖的,當按下home鍵退回到主選單又啟動GOOGLE地圖的應用時,顯示的就是剛才的地圖,實際上是同一個Activity,實際上這就引入了singleInstance。singleInstance模式就是將該Activity單獨放入一個棧中,這樣這個棧中只有這一個Activity,不同應用的intent都由這個Activity接收和展示,這樣就做到了共享。當然前提是這些應用都沒有被銷燬,所以剛才是按下的HOME鍵,如果按下了返回鍵,則無效  

android:taskAffinity 這個屬性給應用的所有的Activity設定了一個親緣關係名,除了那些用它們自己的taskAffinity屬性設定不同親緣關係的元件。

預設情況下,應用程式中的所有元件都會共享相同的親緣關係,親緣關係的名稱跟由<manifest>元素設定的包名相同。

Activity的歸屬,也就是Activity應該在哪個Task中,Activity與Task的吸附關係。預設如果沒有設定taskAffinity,則taskAffinity跟包名是一樣的 taskAffinity 和 FLAG_ACTIVITY_NEW_TASK可用來決定activity啟動時是否需要新建一個task。我們分四種情況看一下這兩個標誌對啟動activity的影響:(前提:從MainActivity中啟動ActivityA) 1)、兩個標誌都不設定 2)、有FLAG_ACTIVITY_NEW_TASK   3)、無FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同於MainActivity) 4)、有FLAG_ACTIVITY_NEW_TASK有taskAffinity 注意上面的標誌都是針對於啟動的ActivityA,FLAG_ACTIVITY_NEW_TASK  是在啟動ActivityA的Intent中設定的,taskAffinity 是在AndroidManifest中ActivityA中設定,另外注意這裡兩個actiity的啟動模式都設定為standard ①、先看第一中情況:

主要程式碼:

<activity android:name=".ActivityA"    
            android:launchMode="standard"  
            android:label="@string/title_activityA">    
  <intent-filter>    
      <action android:name="com.leaves.ipanel.ActivityA"/>    
      <category android:name="android.intent.category.DEFAULT"/>    
  </intent-filter>    
</activity>

MainActivity啟動activity

public void onClick(View arg0) {  
    // TODO Auto-generated method stub  
    Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
    Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
 
    startActivity(intent);   
}

啟動A之後的堆疊:  

②、有FLAG_ACTIVITY_NEW_TASK   我們新增FLAG_ACTIVITY_NEW_TASK  

public void onClick(View arg0) {  
    // TODO Auto-generated method stub  
    Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
    Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    startActivity(intent);   
}

啟動A之後的堆疊:

③、無FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同於MainActivity)

<activity android:name=".ActivityA"    
            android:launchMode="standard"  
            android:taskAffinity="com.leaves.test.ActivityA"  
          android:label="@string/title_activityA">    
       <intent-filter>    
           <action android:name="com.leaves.ipanel.ActivityA"/>    
           <category android:name="android.intent.category.DEFAULT"/>    
       </intent-filter>    
</activity>
public void onClick(View arg0) {  
    // TODO Auto-generated method stub  
    Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
    Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
          
    startActivity(intent);   
}

檢視一下啟動A之後的堆疊:

④、有FLAG_ACTIVITY_NEW_TASK有taskAffinity

把FLAG_ACTIVITY_NEW_TASK新增上去    

public void onClick(View arg0) {  
    // TODO Auto-generated method stub  
    Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());  
    Intent intent = new Intent("com.leaves.ipanel.ActivityA");      
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
    startActivity(intent);   
}

檢視一下啟動A之後的堆疊:

上面我們測試的兩個Activity是在同一個應用中,如果他們在不同的應用中呢,例如ActivityA跟MainActivity不在一個apk中,其實情況還是一樣的.因為預設如果沒有設定taskAffinity,則taskAffinity跟包名是一樣的。若不考慮android:allowTaskReparenting,如果ActivityA跟MainActivity不在一個apk中,當沒有FLAG_ACTIVITY_NEW_TASK時,則兩者應該是在同一個task,但是如果有FLAG_ACTIVITY_NEW_TASK,則兩者應該會在不同的task中。   

Manifest:屬性

<manifest  xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.finddreams.csdn"
          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之間就可以互相共享資料了。詳見:http://wallage.blog.163.com/blog/static/17389624201011010539408/

D、sharedUserLabel

一個共享的使用者名稱,它只有在設定了sharedUserId屬性的前提下才會有意義

E、versionCode

是給裝置程式識別版本(升級)用的必須是一個interger值代表app更新過多少次,比如第一版一般為1,之後若要更新版本就設定為2,3等等。。。

F、versionName

這個名稱是給使用者看的,你可以將你的APP版本號設定為1.1版,後續更新版本設定為1.2、2.0版本等等。。。

G、installLocation

安裝引數,是Android2.2中的一個新特性,installLocation有三個值可以選擇:internalOnly、auto、preferExternal

選擇preferExternal,系統會優先考慮將APK安裝到SD卡上(當然終端使用者可以選擇為內部ROM儲存上,如果SD儲存已滿,也會安裝到內部儲存上)

選擇auto,系統將會根據儲存空間自己去適應

選擇internalOnly是指必須安裝到內部才能執行

Application:屬性

一個AndroidManifest.xml中必須含有一個Application標籤,這個標籤聲明瞭每一個應用程式的元件及其屬性(如icon,label,permission等)

<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。  

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是作為應用程式的入口。

category屬性

category也只有android:name屬性。常見的android:name值為android.intent.category.LAUNCHER(決定應用程式是否顯示在程式列表裡)

meta-data:屬性

<meta-data android:name="string"
           android:resource="resource specification"
           android:value="string"/>

這是該元素的基本結構.可以包含在 四個元素中。

android:name(解釋:元資料項的名字,為了保證這個名字是唯一的,採用java風格的命名規範,如com.woody.project.fried)

android:resource(解釋:資源的一個引用,指定給這個項的值是該資源的id。該id可以通過方法Bundle.getInt()來從meta-data中找到。)

android:value(解釋:指定給這一項的值。可以作為值來指定的資料型別並且元件用來找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getString],[getBoolean])