1. 程式人生 > >Android application 和 activity 標籤詳解

Android application 和 activity 標籤詳解

Application 標籤

  Android:allowTaskReparenting=[“true” | “false”]
  表明了這個應用在 reset task 時,它的所有 activity 是否可以從開啟它們的 task 棧中遷移到它們宣告的 taskAffinity 親和性(taskAffinity 屬性可以檢視我的這篇部落格:android深入解析Activity的launchMode啟動模式,Intent Flag,taskAffinity)棧中,true 代表可以,false 代表不可以。Android 原始碼中,我們從 Home 介面啟動程式時都帶了 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,所以從 Home 介面啟動程式就會進行 reset task,也就會使用到 allowTaskReparenting 這個屬性。
  一般來說,當 Activity 啟動後,它就與啟動它的 Task 關聯,並且在那裡消耗它的整個生命週期,噹噹前的 Task 不再顯示時,你可以使用這個特性來強制 Activity 移動到有著 affinity 的 Task 中。例如在一封 email 郵件中包含一個 web 頁面的連結,點選它就會啟動一個 Browser Activity 來顯示這個頁面,這個 Activity 時由 Browser 應用程式定義的,但是現在它作 email Task 的一部分,將它的 allowTaskReparenting 設定為 true,如果 Browser 下一次進入前臺時,它就會根據 taskAffinity 屬性重新宿主到 Browser Task 棧中,它就能被看見,並且當 email Task 再次進入前臺時,就看不到它了。

  android:allowBackup=[“true” | “false”]
  這個標識用來表示是否允許應用備份相關的資料並且在必要時候恢復還原這些資料,如果該標識設為 false,則代表不備份和恢復任何的應用資料,預設的該標識屬性為 true。當 allowBackup 標識設定為 true 時,使用者即可以通過 adb backup 和 adb restore 來進行對應資料的備份和恢復,這個在很多時候會帶來一定的安全風險。
  adb backup 命令容許任何一個開啟 USB 除錯開關的人從 Android 手機中複製應用資料到外設,一旦應用資料被備份之後,所有應用資料都可被使用者讀取;adb restore 命令允許使用者指定一個恢復的資料來源(即備份的應用資料)來恢復應用程式資料的建立。因此,當一個應用資料被備份之後,使用者即可在其他Android手機或模擬器上安裝同一個應用,以及通過恢復該備份的應用資料到該裝置上,在該裝置上開啟該應用即可恢復到被備份的應用程式的狀態。尤其是通訊錄應用,一旦應用程式支援備份和恢復功能,攻擊者即可通過adb backup和adb restore進行恢復新安裝的同一個應用來檢視聊天記錄等資訊;對於支付金融類應用,攻擊者可通過此來進行惡意支付、盜取存款等;因此為了安全起見,開發者務必將allowBackup標誌值設定為false來關閉應用程式的備份和恢復功能,以免造成資訊洩露和財產損失。
  網上也可以看到很多將 allowBackup 設定為 true 帶來的許多風險,可以看看這篇部落格:

詳解Android App AllowBackup配置帶來的風險

  android:backupAgent=”string”
  android:backupAgent 這個標識是用來設定備份代理,對於大部分應用程式來說,都或多或少儲存著一些永續性的資料,比如資料庫和共享檔案或者有自己的配置資訊,為了保證這些資料和配置資訊的安全性以及完整性,Android提供了這樣一個機制,我們可以通過這個備份機制來儲存配置資訊和資料以便為應用程式提供恢復點。如果使用者將裝置恢復出廠設定或者轉換到一個新的Android裝置上,系統就會在應用程式重新安裝時自動恢復備份資料。這樣,使用者就不需要重新產生它們以前的資料或者設定了。這個程序對於使用者是完全透明的,並且不影響其自身的功能或者應用程式的使用者體驗。要實現備份代理,就必須做兩件事,一是實現 

BackupAgent 或者 BackupAgentHelper 的子類,二是在 Manifest 檔案內用 android:backupAgent 屬性宣告備份代理。

  android:backupInForeground=[“true” | “false”]
  這個標識用來表明Auto Backup for Apps功能是否可以在應用在前臺的時候進行資料的備份。Auto Backup for Apps功能是 Android 6.0 引入的一個新功能,它允許一個應用將自己的備份資料儲存到 Google Drive 上面,每個使用者可以免費儲存 25M 的應用資料,這個新功能需要配合 android:allowBackup 一起使用。 
  這個標識的預設值為 false ,這意味著系統不會備份一個應用的資料,如果這個應用執行在前臺(比如一個音樂軟體的後臺播放 service 是通過 startForeground 開啟的)。

  android:banner=”drawable resource”
  這個標識是用在 Android TV 電視上用輪播圖來代表一個應用,由於輪播圖只是在 HOME 介面上顯示的,所以它僅僅只能被一個帶有能夠處理 CATEGORY_LEANBACK_LAUNCHER intent Activity 的應用宣告。由於這個標識是 Android TV 開發使用到的,在這裡就不詳細介紹了,具體的可以看 Google 的 API 文件。

  android:debuggable=[“true” | “false”]
  這個標識用來表明該應用是否可以被除錯,預設值為 false.

  android:description=”string resource”
  用來宣告關於這個應用的詳細說明,使用者可讀的,必須使用 @string 的樣式來宣告,這個宣告要比 label 標籤宣告的文字更加詳細,而且和 label 不一樣,這個標識不能夠使用 raw string。

  這個標識用來表明系統能否例項化這個應用的元件,true 代表可以,false 代表不可以,如果此值設為 true,則由每個元件的 enabled 屬性確定自身的啟用或禁用,如果此值設為 false ,則覆蓋元件的設定值,所有元件都將被禁用。該標識的預設值是 true 。

  android:extractNativeLibs=[“true” | “false”]
  這個標識為 android 6.0 引入,該屬性如果設定為 false,則系統在安裝應用的時候不會把 so 檔案從 apk 中解壓出來了,同時修改 System.loadLibrary 直接開啟呼叫 apk 中的 so 檔案。但是,目前要讓該技巧生效還需要額外2個條件:一個是apk 中的 .so 檔案不能被壓縮;二個是 .so 必須用 zipalign -p 4 來對齊。該標識的預設值為 true。

  android:fullBackupContent=”string”
  這個標識用來指明備份的資料的規則,該標識當然是配合Auto Backup for Apps來使用的,它也是在 Android 6.0 中引入的,使用的方式如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        package="com.my.appexample">  
    ...
    <app ...  
        android:fullBackupContent="@xml/mybackupscheme">  
    </app>  
    ...  
</manifest>  
在此示例程式碼中,android:fullBackupContent 屬性指定了一個 XML 檔案。該檔名為mybackupscheme.xml,位於應用開發專案的 res/xml/ 目錄中。 此配置檔案包括關於要備份哪些檔案的規則。 下列示例程式碼顯示了將某一特定檔案排除在備份之外的配置檔案:
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <exclude domain="database" path="device_info.db"/>
</full-backup-content>

此示例備份配置僅將一個特定資料庫檔案排除在備份之外,所有其他檔案均予以備份。

  android:fullBackupOnly=[“true” | “false”]
  這個標識用來指明當Auto Backup for Apps功能可以使用的時候是否開啟它。如果該標識設定為 true,在 Android 6.0 以及之上的手機上,應用將會執行Auto Backup for Apps功能,在之前的 Android 版本中,你的應用將會自動忽略該標識,並且切換成 Key/Value Backups

  android:hasCode=[“true” | “false”]
  該標識用來指明應用程式是否包含程式碼,“true”表示包含,“false”表示不包含。 如果此值設為“false”,則在啟動元件時系統不會試圖裝載任何程式程式碼。 預設值是“true”。 
應用程式不包含任何自有程式碼的情況極少發生。 僅當只用到了內建的元件類時才有可能,比如使用了AliasActivity 類的 Activity。

  android:hardwareAccelerated=[“true” | “false”]
  是否為應用程式中所有的 Activity 和 View 啟用硬體加速渲染功能 —“true”表示開啟,“false”表示關閉。 如果 minSdkVersion 或 targetSdkVersion 的值大於等於“14”,則本屬性預設值是“true”,否則,預設值為“false”。
  自 Android 3.0 (API 級別 11)開始,應用程式可以使用硬體加速的 OpenGL 渲染功能來提高很多常用 2D 圖形操作的效能。 當開啟硬體加速渲染功能時,大部分 Canvas、Paint、Xfermode、ColorFilter、Shader 和 Camera 中的操作都會被加速。 即便應用程式沒有顯式地呼叫系統的 OpenGL 庫,這仍能使動畫更加平滑、螢幕滾動也更加流暢、整體響應速度獲得改善。
  請注意,並非所有的 OpenGL 2D 操作都會被加速。 如果開啟了硬體加速渲染功能,請對應用程式進行測試以確保使用渲染時不會出錯。更多詳細的操作可以去檢視 google 文件硬體加速指南

  android:icon=”drawable resource”
  代表整個應用程式的圖示,也即應用程式中每個元件的預設圖示。 請參閱 < activity >、 < activity-alias >、 < service >、 < receiver > < provider > 元素各自的icon屬性。本屬性必須設為對 drawable 資源的引用(例如“ @drawable/icon ”)。 圖示沒有預設值。
  必須要注意到的是這個標識和下面要介紹到的 android:logo 標籤不一樣,這個標籤是在桌面顯示的圖示,而後者是在 actionBar 或者 toolBar 上面顯示的。

  android:isGame=[“true” | “false”]
  這個標識用來指明該應用是否是遊戲,這樣就能夠將該應用和其他應用分離開來,預設的改值為 false。

  android:killAfterRestore=[“true” | “false”]
  這個標識用來指明在手機恢復出廠設定之後,該應用的所有設定資訊都被重置時,該應用是否需要被殺死,單個應用的重置設定操作一般不會造成應用的關閉,整個系統的重置操作一般只會發生一次,那就是手機第一次進入系統時的初始化設定,第三方應用一般情況下不需要用到該標識,
  預設該值為 true,這表明系統重置設定之後,應用程式將在處理資料完成後被關閉。

  android:largeHeap=[“true” | “false”]
  這個標識用來表明這個應用的程序是否需要更大的執行記憶體空間,這個標識對該應用的所有程序都有效,但是需要注意的一點是,這僅僅對第一個載入進這個程序的應用起作用,如果使用者通過 sharedUserId 將多個應用置於同一個程序(SharedUserId 的具體用法可以參考我的部落格:android IPC通訊(上)-sharedUserId&&Messenger),那麼兩個應用都必須要指定該標識並且設定為同一個值,要不然就會產生意想不到的結果。
  大部分應用程式不需要用到本屬性,而是應該關注如何減少記憶體消耗以提高效能。 使用本屬性並不能確保一定會增加可用的記憶體,因為某些裝置可用的記憶體本來就很有限。 
要在執行時查詢可用的記憶體大小,請使用 getMemoryClass() 或getLargeMemoryClass() 方法,後者的方法可以獲取到應用開啟 largeHeap 之後可以獲得的記憶體大小。
  這裡說到一點是,一個應用不應該通過這個屬性來解決 OOM 問題,而是應該通過檢測記憶體洩漏來徹底根治 OOM,而且當記憶體很大的時候,每次gc的時間也會長一些,效能也會隨之下降。

  android:label=”string resource”
  這個標籤應該是很常用的一個標籤,它供使用者閱讀的代表整個應用程式的文字標籤,也即應用程式中每個元件的預設標籤。 請參閱 < activity >、 < activity-alias >、 < service >、 < receiver > < provider > 元素各自的 label 屬性。 
  文字標籤應設為一個字串資源的引用,這樣就能像其它使用者介面內的字串一樣對其進行本地化。 不過,考慮到開發時的便利性,也可以將其直接設為字串。

  android:logo=”drawable resource”
  這個標識指定了整個應用程式的 logo 標識,也即各 Activity 的預設 logo。 
本屬性必須設為對 drawable 資源的引用,該資源中包含了圖片檔案(例如“@drawable/logo”)。 logo 沒有預設值。上面也介紹到了和 android:icon的區別,這個是在 actionBar 或者 toolBar 上面展示的,icon 屬性是在桌面顯示的。

  android:manageSpaceActivity=”string” 
  這個標識用來指定一個 Activity 的名字,當用戶在設定頁面中手動點選清除資料按鈕時,不會像以前一樣把應用的私有目錄/data/data/包名下的資料完全清除,而是跳轉到那個宣告的 activity 中,讓使用者遵照 activity 中提供的功能清除指定的資料。
  感興趣的可以看看該連結:android:manageSpaceActivity讓應用手動管理應用的資料目錄

  android:name=”string”
  該標識用來指定該應用程式 Application 子類的完全限定名稱,該類將優先於所有程式元件被例項化,該子類是可選的,根據應用程式的實際需求看是否使用,但是大多數應用程式都有使用,如果沒有提供該 Application 子類時,Android 將使用 Application 類的例項。

  android:permission=”string”
  該標識用來指定客戶端要與應用程式互動而必須擁有的許可權名稱,本屬性為一次設定適用於全部程式元件的許可權提供了一個便捷途徑,它可以被元件各自的 permission 屬性覆蓋,這個就相當於把 permission 標籤設定給了應用裡面的每個 Activity,Service 等等四大元件,詳細的可以檢視 google 文件的許可權或者另一篇文件安全與許可權。 
  或者可以看看這篇對於 permission 的部落格:android permission許可權與安全機制解析(上)

  android:permission=”string”
  該標識用來指明一個應用程式是否需要一直保持執行狀態,true 代表是,false 代表否,預設值是 false。一般的第三方應用是不應該設定該標識的,持久執行模式適用於某些特定的系統應用,比如通話,簡訊等應用,而且該應用在異常崩潰出現後,雖然這種情況很稀少,會立即重啟,所以該標識第三方應用設定之後是不好用的。
  這個標識的詳細剖析可以看看這個部落格:android persistent屬性研究

  android:process=”string”
  應用程式的全部元件都將運行於其中的程序名稱。 每個元件通過設定各自的 process 屬性,可以覆蓋本預設值。
  預設情況下,當執行應用程式的第一個元件時,Android 會為程式建立一個程序。 然後所有元件都會執行在這個程序中。 預設程序的名稱與應用程式裡面設定的 package 包名一致。
  通過將本屬性設定為其他應用程式的程序名稱,可以讓兩個應用程式的元件運行於同一個程序中 — 但只有這兩個應用程式使用 sharedUserId 指定為同一個 userId 並用要用同一個證書籤名時才行。
  如果賦予本屬性的名稱是以冒號(’:’)開頭的,則必要時將會為應用程式建立一個新的私有程序。 如果程序名稱以小寫字母開頭,則將建立以此名稱命名的全域性程序。 全域性程序可以被其他應用程式共享,以減少資源的佔用。

  android:restoreAnyVersion=[“true” | “false”]
  該標識用來指明一個應用程式可以通過任何版本的備份資料進行資料恢復,就算該備份資料是從當前安裝版本的更新版本應用備份出來的,把這個標識設定為 true 之後,Backup Manager 將會從一個不匹配版本的備份資料進行資料恢復操作,即使發生版本衝突也即資料版本不相容時也是如此。 使用本屬性時一定要特別小心。該標識的預設值為 false。

  android:requiredAccountType=”string”
  該標識為 API18 版本新增,設定應用程式所需的賬戶型別。 如果應用程式需要一個 Account 才能執行,本屬性值必須與賬戶的認證型別(由 AuthenticatorDescription 定義)吻合,比如“com.google”。預設值是 null,表示應用程式不需要任何賬戶就可以執行。因為目前的受限使用者配置功能(Restricted Profile)無法新增賬戶,設定本屬性的應用程式對於受限使用者而言是不可用的, 除非你同時將 android:restrictedAccountType 也宣告為相同的值。 
  提醒:如果賬戶資料可能會洩露個人身份資訊,宣告本屬性就很重要了,並且要把 android:restrictedAccountType 設定為 null ,這樣受限使用者就無法用你的應用程式來訪問機主的個人資訊了。

  android:restrictedAccountType=”string”
  該標識和 android:requiredAccountType 一樣也是 API18 新增,但是和 android:requiredAccountType 不一樣的是該屬性如果設定了後,將會允許受限使用者訪問機主的該賬戶,如果應用程式需要使用 Account 並且允許受限使用者訪問主賬戶,本屬性值必須與應用程式的賬戶認證型別(由 AuthenticatorDescription 定義)吻合,比如“com.google”。預設值為 null ,表示應用程式不需要 任何賬戶就可以執行。 
  提醒:設定本屬性將允許受限使用者通過主賬戶使用你的應用程式,這可能會洩露個人身份資訊。 如果賬戶可能會洩露個人資訊,請勿使用本屬性,而是使用 android:requiredAccountType 屬性,以禁止受限使用者的使用。

  android:resizeableActivity=[“true” | “false”]
  這個標識用來表明應用是否支援分屏操作,這個標識可以設定在 < activity > 或者 標籤上。如果把這個屬性設定為 true,使用者就能把這個應用或者 activity 設定為分屏或者自由模式,如果這個標識設定為 false,該應用或者 activity 將不支援多視窗的分屏模式,如果使用者試圖使用分屏模式開啟該 activity,這個應用也只會充滿整個螢幕。
  如果你應用的 targetAPI 是 24 版本或者更高,雖然你沒有顯示的宣告該標識的值,這個標識的預設值為 true。這個標識是在 API24 版本新增。

  android:supportsRtl=[“true” | “false”]
  這個標識是用來宣告應用是否要支援從右到左的(RTL)佈局方式。 
  如果本標識屬性設定為 true 並且同時 targetSdkVersion 為 17 或者以上版本,則系統將會啟用並使用各種 RTL API ,應用程式就可以顯示 RTL Layout。 如果本屬性設為 false 或者 targetSdkVersion 為 16 以下版本,則 RTL API 將會被忽略或失效,應用程式將忽略與 Layout 方向有關的使用者本地化選項(Layout 都將從左到右佈局)。本屬性的預設值是 false,為 API17 版本新增。

  android:taskAffinity=”string”
  該標識將會對應用的所有 activity 生效,除非該 activity 設定了自己單獨的 taskAffinity 。一般情況下,在沒有顯示設定該標識的情況下,應用的所有 activity 都有同一個 affinity ,該 affinity 名字預設為 package 的名字。 
  關於 taskAffinity 和 launchMode 的詳細介紹和用法可以看看我的這篇部落格:android深入解析Activity的launchMode啟動模式,Intent Flag,taskAffinity

  android:testOnly=[“true” | “false”]
  該標識用來指明這個應用是不是僅僅作為測試的用途,比如,本應用程式可能會暴露一些不屬於自己的功能或資料,這將引發安全漏洞,但對測試而言這又非常有用,而且這種應用程式只能通過 adb 進行安裝。

  android:theme=”resource or theme”
  這個標識用來宣告這個應用的所有 activity 的主題,單獨的一個 activity 可以宣告自己的 theme 主題來覆蓋預設的屬性,具體的可以檢視 google 的官方文件:樣式和主題

  android:uiOptions=[“none” | “splitActionBarWhenNarrow”]
  這個標識用來指定這個應用所有的 Activity 的 UI 附加選項,它有兩個值:

ValueDescription
“none” 沒有其他的 UI 選項,改值為這個標識的預設值
“splitActionBarWhenNarrow” 當水平空間受限時(例如在手持裝置上的縱向模式下時)在螢幕底部新增一個欄以顯示應用欄(也稱為操作欄)中的操作項。 應用欄不是以少量操作項形式出現在螢幕頂部的應用欄中,而是分成了頂部導航區和底部操作項欄。 這可以確保操作項以及頂部的導航和標題元素都能獲得合理的空間。 選單項不會拆分到兩個欄中,它們始終一起出現。

這個標識在 API14 版本新增,一般情況下很少會用到這個標識,我曾經只在魅族手機的適配過程中用到了這個標識,想要了解詳細的適配,可以去看看 google 官方的官方教程新增應用欄

  android:usesCleartextTraffic=[“true” | “false”]
  這個標識為 API23 版本也就是 Android M 新增,它用來指明應用是否需要使用明文的網路連線,例如明文的 HTTP 連線,這個標識的預設值為 true。
  當這個標識設定為 false 的時候,平臺的元件(例如,HTTP 和 FTP 棧,DownloadManagerMediaPlayer)將會拒絕應用使用明文的請求。第三方的庫強烈建議也遵守這個設定,避免使用明文請求連線的核心原因是會缺少機密性,可靠性,而且可以保護請求不受到惡意的篡改:一個網路攻擊者可能會監聽網路傳輸的資料,而且能夠在不被檢測的情況下修改這些資料。
  當然這個標識也只是在最理想的情況下去遵守的,因為考慮到 Android 應用被提供的使用等級,是不可能避免他們所有的明文請求。例如,Socket API 就不一定需要遵守這個標識,因為它也不能決定這個連結是不是明文。然而,多數的應用網路請求連線都被高層次的網路棧/元件所處理,而這些棧/元件可以通過讀取 ApplicationInfo.flags 或者 NetworkSecurityPolicy.isCleartextTrafficPermitted()來遵守這個標識。
  需要注意的是 WebView 不需要遵守這個標識。在 app 的開發過程中,也可以使用 StrictMode 來檢測明文的請求連線,使用方式為 StrictMode.VmPolicy.Builder.detectCleartextNetwork().
  當usesCleartextTraffic被設定為false,應用程式會在使用HTTP而不是HTTPS時崩潰。
  在 API24 也就是 Android 7.0 及以上版本中,如果配置了 Android Network Security ,那麼這個標識將會被自動忽略。

  android:vmSafeMode=[“true” | “false”]
  這個標識用來指明這個應用是否想讓 VM 虛擬機器執行在安全模式,預設值為 false,這個標識是 API8 版本新增,如果設定為 true 將會禁用 Dalvik just-in-time(JIT)編譯器,這個標識在 API22 版本之後為新版本做了改進,因為 4.4 之後 Dalvik 虛擬機器就被廢棄了,在 22 版本之後這個標識如果設定為 true 將會禁用 ART ahead-of-time(AOT)編譯器。 
  詳細的可以看看這篇介紹:ART、JIT、AOT、Dalvik之間有什麼關係?

Activity 標籤

  android:allowEmbedded=[“true” | “false”]
  這個標識一般為開發可穿戴裝置時使用,表示該 Activity 可作為另一 Activity 的嵌入式子項啟動。 它尤其適用於子項所在的容器(如 Display)為另一 Activity 所擁有的情況。 例如,用於 Wear 自定義通知的 Activity 必須宣告此項,以便 Wear 在其上下文流中顯示 Activity,後者位於另一程序中。該屬性的預設值為 false。

  android:allowTaskReparenting=[“true” | “false”]
  這個標示和 Application 的標識意義一樣,所以如果同時宣告該標識,這個標識會覆蓋 Application 的標識,

  android:alwaysRetainTaskState=[“true” | “false”]
  這個標識用來指示系統是否始終保持 Activity 所在任務的狀態 —“true”表示保持,“false”表示允許系統在特定情況下將任務重置到其初始狀態。 預設值為“false”。該屬性只對任務的根 Activity 有意義;對於所有其他 Activity,均忽略該屬性。
  正常情況下,當用戶從主螢幕重新選擇某個任務時,系統會在特定情況下清除該任務(從根 Activity 之上的堆疊中移除所有 Activity)。 系統通常會在使用者一段時間(如 30 分鐘)內未訪問任務時執行此操作。
  不過,如果該屬性的值是“true”,則無論使用者如何到達任務,將始終返回到最後狀態的任務。 例如,在網路瀏覽器這類存在大量使用者不願失去的狀態(如多個開啟的標籤)的應用中,該屬性會很有用。
  這個有點抽象,舉個例子,開啟客戶端的順序是 SplashActivity –> GuideActivity –> MainActivity(歡迎頁面 –> 功能引導頁面 –> 主頁面),那麼,它在任務棧中就是:
   
  由於我們在 Androidmanifest.xml 檔案中,給 SplashActivity 設定 android:alwaysRetainTaskState=’true’,當我們按 HOME 鍵返回桌面,任務棧的狀態被保留著,當我們點選應用圖示開啟再次應用時,系統會判斷是否已經存在以 SplashActivity 為根 Activity 的棧,如果有,那麼就直接使用該棧,並顯示棧頂的 Activity。注意,只需要設定根 Activity 就可以了。

  android:autoRemoveFromRecents=[“true” | “false”]
  這個標識為 API21 版本新增,由具有該屬性的 Activity 啟動的任務是否一直保留在概覽螢幕中,直至任務中的最後一個 Activity 完成為止。 若為 true,則自動從概覽螢幕中移除任務。 它會替換呼叫方使用的 FLAG_ACTIVITY_RETAIN_IN_RECENTS。 它必須是布林值“true”或“false”。

  android:banner=”drawable resource”
  這個和 application 裡面的 banner 標識一樣,也是用在 android TV 上的,在這裡也不詳細介紹了,可以去看看 google 官方文件

  android:clearTaskOnLaunch=[“true” | “false”]
  這個標識用來指明當應用從主螢幕重新啟動時是否都從中移除除根 Activity 之外的所有 Activity,true 表示始終將任務清除到只剩其根 Activity,false 表示不清除,預設值為 false。需要注意的是該屬性只對啟動新任務的 Activity(根 Activity)有意義;對於任務中的所有其他 Activity,均忽略該屬性。當值為“false”時,可在某些情況下清除任務中的 Activity(參考結合 alwaysRetainTaskState 屬性),但並非一律可以。如果該屬性和 allowTaskReparenting 的值均為“true”,則如上所述,任何可以更改父項的 Activity 都將轉移到與其有親和關係的任務;其餘 Activity 隨即被移除。
  例如,假定有人從主螢幕啟動了 Activity P,然後從那裡轉到 Activity Q。該使用者接著按了主螢幕按鈕,然後返回到 Activity P。正常情況下,使用者將看到 Activity Q,因為那是其最後在 P 的任務中執行的 Activity。 不過,如果 P 將此標誌設定為“true”,則當用戶按下主螢幕將任務轉入後臺時,其上的所有 Activity(在本例中為 Q)都會被移除。 因此使用者返回任務時只會看到 P。

android:configChanges=[“mcc”, “mnc”, “locale”, “touchscreen”, “keyboard”, “keyboardHidden”,
“navigation”, “screenLayout”, “fontScale”, “uiMode”, “orientation”, “screenSize”, “smallestScreenSize”]

  
  列出 Activity 將自行處理的配置更改。在執行時發生配置更改時,預設情況下會關閉 Activity 然後將其重新啟動,但使用該屬性宣告配置將阻止 Activity 重新啟動。 Activity 反而會保持執行狀態,並且系統會呼叫其 onConfigurationChanged() 方法。以下為該屬性的值,多個值使用“|”分隔 — 例如,“locale|navigation|orientation”:

ValueDescription
“mcc” IMSI 移動國家/地區程式碼 (MCC) 發生了變化 - 檢測到了 SIM 並更新了 MCC。
“mnc” IMSI 行動網路程式碼 (MNC) 發生了變化 - 檢測到了 SIM 並更新了 MNC。
locale” 語言區域發生了變化 — 使用者為文字選擇了新的顯示語言。
“touchscreen” 觸控式螢幕發生了變化。(這種情況通常永遠不會發生。)
“keyboard” 鍵盤型別發生了變化 — 例如,使用者插入了一個外接鍵盤。
“keyboardHidden” 鍵盤無障礙功能發生了變化 — 例如,使用者顯示了硬體鍵盤。
“navigation” 導航型別(軌跡球/方向鍵)發生了變化。(這種情況通常永遠不會發生。)
“screenLayout” 屏幕布局發生了變化 — 這可能是由激活了其他顯示方式所致。
“fontScale” 字型縮放係數發生了變化 — 使用者選擇了新的全域性字號。
“uiMode” 使用者介面模式發生了變化 — 這可能是因使用者將裝置放入桌面/車載基座或夜間模式發生變化所致。 
請參閱 UiModeManager。 此項為 API 級別 8 中新增配置。
“orientation” 螢幕方向發生了變化 — 使用者旋轉了裝置。 
注:如果您的應用面向 API 級別 13 或更高級別(按照 minSdkVersion 和 targetSdkVersion 屬性所宣告的級別),
則還應宣告 “screenSize” 配置,因為當裝置在橫向與縱向之間切換時,該配置也會發生變化。
“screenSize” 當前可用螢幕尺寸發生了變化。它表示當前可用尺寸相對於當前縱橫比的變化,因此會在使用者在橫向與縱向之間切換時發生變化。 
不過,如果您的應用面向 API 級別 12 或更低級別,則 Activity 始終會自行處理此配置變更
(即便是在 Android 3.2 或更高版本的裝置上執行,此配置變更也不會重新啟動 Activity)。
此項為 API 級別 13 中新增配置。
“smallestScreenSize” 物理螢幕尺寸發生了變化。它表示與方向無關的尺寸變化,因此只有在實際物理螢幕尺寸發生變化(如切換到外部顯示器)時才會變化。
對此配置的變更對應於smallestWidth 配置的變化。 不過,如果您的應用面向 API 級別 12 或更低級別,則 Activity 始終會自行處理此配置變更
(即便是在 Android 3.2 或更高版本的裝置上執行,此配置變更也不會重新啟動 Activity)。
此項為 API 級別 13 中新增配置。
“layoutDirection” 佈局方向發生了變化。例如,從從左至右 (LTR) 更改為從右至左 (RTL)。 此項為 API 級別 17 中新增配置。

所有這些配置變更都可能影響應用看到的資源值。 因此,呼叫 onConfigurationChanged() 時,通常有必要再次獲取所有資源(包括檢視佈局、可繪製物件等),以正確處理變化。 
  我們平常接觸到最多的就是螢幕的旋轉,螢幕的旋轉如果在沒有特殊設定的情況下會銷燬當前的 Activity 重新建立一個新的,為了避免建立新的,就可以在 AndroidMainfest.xml 中對指定 Activity 對應的 配置android:configChanges=”orientation”,這樣,每次旋轉方向時,只有 onConfigurationChanged 方法被呼叫,沒有了銷燬重建的過程。

  **android:documentLaunchMode=[“intoExisting” | “always” | 
“none” | “never”]**
  指定每次啟動任務時應如何向其中新增新的 Activity 例項。 該屬性允許使用者讓多個來自同一應用的文件出現在概覽螢幕(recent app)中。該屬性有四個值,會在使用者使用該應用開啟文件時產生以下效果:

ValueDescription
“none” 該 Activity 不會為 Activity 建立新任務。這是預設值,它只會在設定了 FLAG_ACTIVITY_NEW_TASK 時建立新任務。 概覽螢幕將按其預設方式對待此 Activity:為應用顯示單個任務,該任務將從使用者上次呼叫的任意 Activity 開始繼續執行。
“never”

  android:enabled=[“true” | “false”]
  該屬性用來標示系統是否可將 Activity 例項化 — “true” 表示可以,“false”表示不可以。 預設值為“true”。
  上面提到了 元素具有自己的 enabled 屬性,該屬性適用於所有應用元件,包括 Activity。 和 屬性必須都是“true”(因為它們都預設使用該值),系統才能將 Activity 例項化。 如果任何一個屬性是“false”,則無法進行例項化。

  android:excludeFromRecents=[“true” | “false”]
  該標識用來標示是否應將該 Activity 啟動的任務排除在最近使用的應用列表(即概覽螢幕)之外。 也就是說,當該 Activity 是新任務的根 Activity 時,此屬性確定任務是否應出現在最近使用的應用列表中。 如果應將任務排除在列表之外,請設定“true”;如果應將其包括在內,則設定“false”。 預設值為“false”。

  android:exported=[“true” | “false”]
  該標識用來指明Activity 是否可由其他應用的元件啟動 —“true”表示可以,“false”表示不可以。若為“false”,則 Activity 只能由同一應用的元件或使用同一使用者 ID 的不同應用啟動。
  需要注意的是該預設值取決於 Activity 是否包含 Intent 過濾器。沒有任何過濾器意味著 Activity 只能通過指定其確切的類名稱進行呼叫。 這意味著 Activity 專供應用內部使用(因為其他應用不知曉其類名稱)。 因此,在這種情況下,預設值為“false”。另一方面,至少存在一個過濾器意味著 Activity 專供外部使用,因此預設值為“true”。
  該屬性並非限制 Activity 對其他應用開放度的唯一手段。 您還可以利用許可權來限制哪些外部實體可以呼叫 Activity(請參閱 permission 屬性),具體的也可以看看android permission許可權與安全機制解析(上)android permission許可權與安全機制解析(下)這兩篇部落格,詳細描述了許可權的相關。 
  這個標識的使用例子可以參考android IPC通訊(上)-sharedUserId&&Messenger

  android:finishOnTaskLaunch=[“true” | “false”]
  該標識用來標示每當使用者再次啟動其任務(在主螢幕上選擇任務)時,是否應關閉(完成)現有 Activity 例項 —“true”表示應關閉,“false”表示不應關閉。 預設值為“false”。如果該屬性和 allowTaskReparenting 均為“true”,則優先使用該屬性。 Activity 的親和關係會被忽略。 系統不是更改 Activity 的父項,而是將其銷燬。

  android:hardwareAccelerated=[“true” | “false”]
  該標識用來表明是否應為此 Activity 啟用硬體加速渲染 —“true”表示應啟用,“false”表示不應啟用,預設值為“false”。
  和 application 的標識不一樣的是,該標示只針對 Activity。
  從 Android 3.0 開始,為應用提供了硬體加速 OpenGL 渲染器,以改善許多常見 2D 圖形運算的效能。 啟用硬體加速渲染器時,Canvas、Paint、Xfermode、ColorFilter、Shader 和 Camera 中的大多數運算都會得到加速。這可以提高動畫、滾動的流暢度和總體響應速度,即便是並不明確使用框架 OpenGL 庫的應用也會受益。 由於啟用硬體加速會增加資源消耗,因此您的應用將佔用更多記憶體。 
  需要注意的是,並非所有 OpenGL 2D 運算都會得到加速。如果您啟用硬體加速渲染器,請對應用進行測試,以確保其在利用渲染器時不會出錯。

  一個表示 Activity 的圖示。該圖示會在需要在螢幕上表示 Activity 時顯示給使用者。 例如,代表啟動任務的 Activity 的圖示顯示在啟動器視窗中。該圖示通常附帶標籤(請參閱 android:label 屬性)。
  必須將該屬性設定為對包含影象定義的可繪製資源的引用。 如果未設定該屬性,則改為使用為應用整體指定的圖示(請參閱 元素的 icon 屬性),activity 的該屬性會覆蓋 application 的該屬性。這個 Activity 的圖示 — 無論設置於此處還是由 元素設定 — 同時也是 Activity 所有 Intent 過濾器的預設圖示(請參閱 元素的 icon 屬性)。

  android:label=”string resource”
  一種可由使用者讀取的 Activity 標籤。該標籤會在必須將 Activity 呈現給使用者時顯示在螢幕上。 它通常與 Activity 圖示一併顯示。如果未設定該屬性,則改為使用為應用整體設定的標籤(請參閱 元素的 label 屬性),activity 的該屬性會覆蓋 application 的該屬性。
  這個 Activity 的標籤 — 無論設置於此處還是由 元素設定 — 同時也是 Activity 所有 Intent 過濾器的預設標籤(請參閱 元素的 label 屬性)。應將該標籤設定為對字串資源的引用,以便可以像使用者介面中的其他字串那樣進行本地化。不過,為便於開發應用,也可將其設定為原始字串。

  android:launchMode=[“standard” | “singleTop” | “singleTask” | “singleInstance”]
 詳情請看這篇部落格,介紹的非常清楚android深入解析Activity的launchMode啟動模式,Intent Flag,taskAffinity

  android:maxRecents=”integer”
  該標識用來指明概覽螢幕中位於此 Activity 根位置的任務數上限。 達到該條目數時,系統會從概覽螢幕中移除最近最少使用的例項。 有效值為 1-50(低記憶體裝置使用 25);0 為無效值。 該值必須是整數,例如 50。預設值為 16。

  android:multiprocess=[“true” | “false”]
  該標識用來指明是否可以將 Activity 例項啟動到啟動該例項的元件程序內 —“true”表示可以,“false”表示不可以。預設值為“false”。
  正常情況下,新的 Activity 例項會啟動到定義它的應用程序內,因此所有 Activity 例項都在同一程序內執行。 不過,如果該標誌設定為“true”,Activity 例項便可在多個程序內執行,這樣系統就能在任何使用例項的地方建立例項(前提是許可權允許這樣做),但是貌似使用的場景和案例不是很多。

  android:name=”string”
  該標識應該不用介紹了,用來指定 Activity 的類的名稱,是 Activity 的子類。 該屬性值應為完全限定類名稱(例如,“com.example.project.DemoActivity”)。不過,為了簡便起見,如果名稱的第一個字元是句點(例如,“.DemoActivity”),則名稱將追加到 元素中指定的軟體包 com.example.project 名稱之後。還有一個需要注意的是,應用一旦釋出,即不應更改該名稱(除非您設定了 android:exported=”false”),也就是說如果您的 Activity 有讓其他應用使用到,那麼最好不要修改名字,因為有可能其他應用是通過顯式的方式指定的 Activity 名字,修改名字可能會造成其他應用無法正常使用甚至崩潰。
  該標識沒有預設值。必須指定該名稱。

  android:noHistory=[“true” | “false”]
  當用戶離開 Activity 並且其在螢幕上不再可見時,是否應從 Activity 堆疊中將其移除並完成(呼叫其 finish() 方法)—“true”表示應將其完成,“false”表示不應將其完成。 預設值為“false”。
  “true”一值表示 Activity 不會留下歷史軌跡。 它不會留在任務的 Activity 堆疊內,因此使用者將無法返回 Activity。 所以有一點需要特別注意的是,在此情況下,如果從這個定義了 noHistory 的 Activity 啟動另一個 Activity 來獲取它的結果,系統永遠不會呼叫 onActivityResult(),因為此時這個 Activity 已經關閉了。

  android:parentActivityName=”string”
  Activity 邏輯父項的類名稱。此處的名稱必須與為相應 元素的 android:name 屬性指定的類名稱一致。系統會讀取該屬性,以確定當用戶按下操作欄中的“向上”按鈕時應該啟動哪一個 Activity。 系統還可以利用這些資訊通過 TaskStackBuilder 合成 Activity 的返回棧。 
  要支援 API 級別 4 - 16,您還可以使用為 “android.support.PARENT_ACTIVITY” 指定值的 元素來宣告父 Activity。例如:

<activity
    android:name="com.example.app.ChildActivity"
    android:label="@string/title_child_activity"
    android:parentActivityName="com.example.app.MainActivity" >
    <!-- Parent activity meta-data to support API level 4+ -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.app.MainActivity" />
</activity>

  android:process=”string”
  應在其中執行 Activity 的程序的名稱。正常情況下,應用的所有元件都在為應用建立的預設程序名稱內執行,您無需使用該屬性。 但在必要時,您可以使用該屬性替換預設程序名稱,以便讓應用元件散佈到多個程序中。如果為該屬性分配的名稱以冒號(“:”)開頭,則會在需要時建立應用專用的新程序,並且 Activity 會在該程序中執行。如果程序名稱以小寫字元開頭,Activity 將在該名稱的全域性程序中執行,前提是它擁有相應的許可權。這可以讓不同應用中的元件共享一個程序,從而減少資源佔用。
  上面提到的 Application 元素的 process 屬性可為所有元件設定一個不同的預設程序名稱。

  Activity 是否將其任務識別符號交給任務棧中在其之上的 Activity。 如果任務根 Activity 的該屬性設定為“true”,則任務會用其內的下一個 Activity 的 Intent 替換基本 Intent。 如果下一個 Activity 的該屬性也設定為“true”,則該 Activity 會將基本 Intent 給予其在同一任務中啟動的任何 Activity。 系統繼續為每個 Activity 執行此過程,直至遇到的某個 Activity 將該屬性設定為“false”為止。 預設值為“false”。
  還有一個很有意思的功能是,如果該屬性設定為“true”,則 Activity 還可利用 ActivityManager.TaskDescription 來更改概覽螢幕中的標籤、顏色和圖示。

  android:resizeableActivity=[“true” | “false”]
  這個標識和 裡面的作用一樣,如果在 activity 裡面定義的話則代表這個 activity 是否支援分屏模式。如果您將該屬性設定為 true,則使用者可以分屏和自由形狀模式啟動 Activity。 如果您將該屬性設定為 false,Activity 將不支援多視窗模式。 如果該值為 false,且使用者嘗試在多視窗模式下啟動 Activity,該 Activity 將全屏顯示。
  該屬性是在 API 級別 24 新增的,如果您的應用面向 API 級別 24 或更高級別,但未對該屬性指定值,則該屬性的值預設設為 true。

 android:screenOrientation=[“unspecified” | “behind” | 
“landscape” | “portrait” | 
“reverseLandscape” | “reversePortrait” | 
“sensorLandscape” | “sensorPortrait” | 
“userLandscape” | “userPortrait” | 
“sensor” | “fullSensor” | “nosensor” | 
“user” | “fullUser” | “locked”]


  Activity 在裝置上的顯示方向。如果 Activity 是在多視窗模式下執行,系統會忽略該屬性。它的取值可以是如下:

ValueDescription
“unspecified” 預設值。由系統選擇方向。在不同裝置上,系統使用的政策以及基於政策在特定上下文所做的選擇可能有所差異。
“behind” 與 Activity 棧中緊接著它的 Activity 的方向相同。
“landscape” 橫向方向(顯示的寬度大於高度)。
“portrait” 縱向方向(顯示的高度大於寬度)。
“reverseLandscape” 與正常橫向方向相反的橫向方向。API 級別 9 中的新增配置。
“reversePortrait” 與正常縱向方向相反的縱向方向。API 級別 9 中的新增配置。
“sensorLandscape” 橫向方向,但根據裝置感測器,可以是正常或反向的橫向方向。API 級別 9 中的新增配置。
“sensorPortrait” 縱向方向,但根據裝置感測器,可以是正常或反向的縱向方向。API 級別 9 中的新增配置。
“userLandscape” 橫向方向,但根據裝置感測器和使用者的感測器首選項,可以是正常或反向的橫向方向。 如果使用者鎖定了基於感測器的旋轉,其行為與 landscape 相同,否則,其行為與 sensorLandscape 相同。API 級別 18 中的新增配置。
“userPortrait” 縱向方向,但根據裝置感測器和使用者的感測器首選項,可以是正常或反向的縱向方向。 如果使用者鎖定了基於感測器的旋轉,其行為與 portrait 相同,否則,其行為與 sensorPortrait 相同。API 級別 18 中的新增配置。
“sensor” 方向由裝置方向感測器決定。顯示方向取決於使用者如何手持裝置,它會在使用者旋轉裝置時發生變化。 但一些裝置預設情況下不會旋轉到所有四種可能的方向。要允許全部四種方向,請使用 “fullSensor”。
“fullSensor” 方向由 4 種方向中任一方向的裝置方向感測器決定。這與 “sensor” 類似,不同的是它允許所有 4 種可能的螢幕方向,無論裝置正常情況下采用什麼方向(例如,一些裝置正常情況下不使用反向縱向或反向橫向,但它支援這些方向)。 API 級別 9 中的新增配置。
“nosensor” 決定方向時不考慮物理方向感測器。感測器會被忽略,因此顯示不會隨使用者對裝置的移動而旋轉。 除了這個區別,系統在選擇方向時使用的政策與“unspecified”設定相同。
“user” 使用者當前的首選方向。
“fullUser” 如果使用者鎖定了基於感測器的旋轉,其行為與 user 相同,否則,其行為與 fullSensor 相同,允許所有 4 種可能的螢幕方向。 API 級別 18 中的新增配置。
“locked” 將方向鎖定在其當前的任意旋轉方向。API 級別 18 中的新增配置。

注:如果您宣告其中一個橫向或縱向值,系統將其視為對 Activity 執行方向的硬性要求。 因此,您宣告的值支援通過 Google Play 之類的服務進行過濾,這樣就能將您的應用只提供給支援 Activity 所要求方向的裝置。 例如,如果您聲明瞭 “landscape”、”reverseLandscape” 或 “sensorLandscape”,則您的應用將只提供給支援橫向方向的裝置。 不過,您還應通過 元素明確宣告,您的應用要求採用縱向或橫向方向。 例如,。這純粹是 Google Play(以及其他支援它的服務)提供的一種過濾行為,平臺本身並不能控制當裝置僅支援特定方向時您的應用能否安裝。

  android:stateNotNeeded=[“true” | “false”]
  該標識用來指明能否在不儲存 Activity 狀態的情況下將其終止併成功重新啟動 —“true”表示可在不考慮其之前狀態的情況下重新啟動,“false”表示需要之前狀態,預設值為“false”。一般情況下,為儲存資源而暫時關閉 Activity 前,系統會呼叫 onSaveInstanceState() 方法,該方法將 Activity 的當前狀態儲存在一個 Bundle 物件中,然後在 Activity 重新啟動時將其傳遞給 onCreate() 。如果該屬性設定為 true,系統可能不會呼叫 onSaveInstanceState(),並且會向 onCreate() 傳遞 null 而不是 Bundle,這樣就與它在 Activity 首次啟動時完全一樣。
  這個標識又一個特別有用的地方是,true 設定可確保 Activity 能夠在未保留狀態時重新啟動。 例如,顯示主螢幕的 Activity 可以使用該設定來確保其由於某種原因崩潰時不會被移除。

  android:supportsPictureInPicture=[“true” | “false”]
  指定 Activity 是否支援畫中畫顯示,設定該屬性的同時,需要將 android:resizeableActivity 標識設定為 true,要不然系統會忽略該屬性,可以看到設定完該屬性之後,android TV 就可以實現手機端一個懸浮 activity 的效果,類似於 youtube 。
  所以同樣這個標識和 android:resizeableActivity 一樣都是 API24 版本新增的。

  android:taskAffinity=”string”
  這個標識用來指明一個 Activity 的親和性,使用方案可以看看我的部落格:android深入解析Activity的launchMode啟動模式,Intent Flag,taskAffinity。從概念上講,具有相同親和關係的 Activity 歸屬同一任務(從使用者的角度來看,則是歸屬同一“應用”)。 任務的親和關係由其根 Activity 的親和關係確定。親和關係確定兩件事 - Activity 更改到的父項任務(請參閱上面提到的 allowTaskReparenting 屬性)和通過 FLAG_ACTIVITY_NEW_TASK 標誌啟動 Activity 時將用來容納它的任務。預設情況下,應用中的所有 Activity 都具有相同的親和關係。您可以設定該屬性來以不同方式組合它們,甚至可以將在不同應