Android xml application屬性詳解


例子:java

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

描述:android

應用的聲明。這個元素包含了子元素,這些子元素聲明瞭應用的組件,元素的屬性將會影響應用下的全部組件。不少屬性爲組件設置了默認值。有些屬性設置了全局值而且不能被組件修改。app

屬性:函數

一、android:allowClearUserData工具

是否給以用戶刪除用戶數據的權限,若是爲true應用管理者就擁有清除數據的權限;false沒有。默認爲true。測試

二、android:allowTaskReparentingui

應用定義的activities是否能夠被從啓動的任務轉移到和他有相同而且將被帶到前臺的任務。true他們能夠被轉移,若是爲false,他們必須和啓動他們的任務保持在一塊兒。默認爲false。編碼

主要做用是activity的遷移,即從一個task遷移到另外一個task,這個遷移跟activity的taskAffinity有關,必須是將該activity從舊的 taskAffinity遷移到新的taskAffinity中.只有設置了FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標識才會用到該屬性。從home上啓動的程序都會設置該Flag,會進行task reset.spa

下面舉個例子,有兩個apk
debug

apk1中含有個Activity:MainActivityA和ActivityB, ActivityB設置了allowTaskReparenting爲false.
apk2中含有兩一個activity:MainActivityB,MainActivityB點擊的時候會啓動ActivityB

首先咱們啓動apk2,進入MainActivityB,點擊MainActivityB會進入ActivityB, 按home鍵,再從Home鍵啓動apk1,用dumpsys工具獲得這個時候的堆棧:

圖中藍色線框部分表示對應的Activity所屬的task

能夠看到,然從Home啓動apk1的時候帶有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,但在任務重置的過程當中什麼事也沒有作。 
咱們把ActivityB的allowTaskReparenting改成true,這個時候前面的步驟同樣,當咱們從Home啓動apk1時,咱們驚奇的發現,啓動的居然是ActivityB,能夠看到此時的堆棧:


這是因爲重置任務的時候把它遷移到了新啓動的task中。分析android源碼中的resetTaskIfNeededLocked函數時就會明白這個是怎麼回事了。

三、android:backupAgent

實現應用的備份代理的類名,BackupAgent的子類。這個屬性的名稱因該是全限定類名(如,"com.example.project.MyBackupAgent")。可是,若是名稱的首字母被設置爲點號,也能夠爲類名(如,".MyBackupAgent"),他將被追加到在<manifest>元素中定義的包名後。沒有默認值。

四、android:debuggable

應用是否可使用debug,甚至運行在用戶模式下。true能夠,false不能。默認爲false。

五、android:description

用戶可讀的,比應用標籤更長、更多的應用描述。此值必須是一個引用字符串。不像標籤,他不能被設置爲硬編碼字符串。沒有默認值。

六、android:enabled

Android系統是否能夠實例化應用的組件。若是爲true能夠,若是爲false不能夠。若是爲true時,每一個組件的enabled屬性決定了此組件

是否可用。若是爲false,他重寫了組件指定值,全部的組件將不還用。默認爲true。

七、android:hasCode

應用是否包含代碼。true表示包含,false表示不包含。當值爲false時,在啓動組件是系統不會試着加載應用的任何代碼。默認爲true。

八、android:icon

整個應用的圖標,仍是每一個組件的默認圖標。這個屬性值必須被設置爲drawable資源的引用。沒有默認值。

九、android:killAfterRestore

在整型系統重置操做中,當他的設置被重置後,應用是否應該被終止。單個包的重置操做不會引發應用被關閉。整個系統的恢復操做僅表明性的發生一次,當電話第一次被設置時。第三方應用將不會常用此屬性。

默認值爲true,意思是,當整個系統被恢復時,應用運行玩他的數據後,將會終止。

十、android:label

一個易讀的應用標籤,而且仍是應用的每一個組件的默認標籤。這個標籤應該被設置爲引用字符串資源,固然他也能夠像其餘字符串同樣在用戶接口中指定。可是爲了方便,在應用開發時,能夠被設置未定義字符串。

十一、android:manageSpaceActivity

一個Activity子類的全限定名稱,這個Activity能夠被系統啓動讓用戶管理此應用佔有的存儲空間。這個Activity也應該用<activity>元素聲明。

十二、android:name

爲這個應用實現的Application子類的全限定名稱。當應用啓動時,這個類將在應用的其餘組件以前被實例化。

這個子類是可選的;大多數應用不須要。在缺省時,Android使用基本Application類的實例。

1三、android:permission

客戶爲了和應用交互必須設置的許可的名稱。這個屬性是一個便利的途徑爲應用的組件設置許可。他能夠被組件的permission屬性重寫。

1四、android:persistent

應用是否在全部時間下都保持運行。true是,false不是。默認爲false。一般狀況下應用不該該設置此標識。持久模式僅僅被幾個系統應用指定。

1五、android:process

爲應用下的組件定一個運行進程名稱。每一個組件能夠定義本身的進程名稱經過設置本身的process屬性。

在默認狀況下,Android爲應用建立一個進程,當應用的第一個組件須要運行時。全部的組件在同一個進程下運行。這個進程的名稱和在<manifest>元素設置的backage屬性名相同。經過設置這個屬性在能夠在其餘應用中共享,你能夠協調應用的組件在同一個進程中運行,可是隻有兩應用也共享用戶ID和簽定相同的證書。若是這個屬性的名稱一個冒號(":")開始,一個新的私有的進程將被建立。若是一個進程的名稱以小寫字母開頭,一個公共的進程將被建立。一個公共的進程能夠被其餘應用共享,來減小資源的使用。

1六、android:restoreAnyVersion

代表這個應用準備嘗試恢復全部的備份數據集合,甚至若是備份數據是比當前安裝的應用高的編號存儲的。設置爲true將容許備份管理者去嘗試恢復當版本不匹配,意思是數據衝突。要當心使用。默認爲false。

1七、android:taskAffinity

提供給應用下全部組件的類同名稱,除了設置了本身的taskAffinity屬性的組件。默認狀況下全部的組件使用相同的affinity。Affinity的名稱和在<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中。 

1八、android:theme

爲應用下的組件定義一個引用自樣式資源的主題。個別的activities能夠設置本身的主題,經過設置本身的theme屬性。

1九、android:uiOptions

這個屬性設置了Activity的UI的額外選項。它必須是下表中的一個值:

相關文章
相關標籤/搜索