Android清單文件具體解釋(六) ---- <activity>節點的屬性
1.android:allowTaskReparenting
android:allowTaskReparenting是一個任務調整屬性,它表明當這個任務又一次被送到前臺時,該應用程序所定義的Activity能否夠從被啟動的任務中轉移到有同樣親和力的任務中。
看過前面博文都知道,解說過這個屬性,為什麽在這裏還要在提一次呢?由於它與<application>的android:allowTaskReparenting屬性重疊,因此當為正在配置的Activity提供該屬性的時候,它的默認值首先來自<application>節點。假設<application>節點上沒有配置該屬性的時候,則false就是它的默認值。
通常,當一個Activity啟動的時候,Activity管理服務就會為這個Activity生成一個任務並將此Activity與之相關聯。
在一個任務中可能存在多個Activity,它依照一定順序排列在這個任務中,我們能夠使用這個屬性來強制它又一次成為此任務的頂層Activity。
在當前的任務不再顯示時,也就是說,與此Activity相關聯任務不在前臺顯示的時候,能夠使用這個特性來強制Activity轉移到與之有同樣親和力的任務(taskAffinity屬性定義的任務)中。典型的使用方法是把一個應用程序的Activity移到還有一個應用程序的主任務中。
比如,假設我們收到的一條短信(MMS應用程序)中包括一個電話號碼文本。此時能夠單擊電話號碼來啟動撥號的快捷界面。
可是,這個撥號界面是聯系人應用程序的一個Activity。在這個場景下,它可能成為MMS應用程序啟動的任務中的一個Activity。並位於該任務的頂層。假設它又一次定位到聯系人的任務中。則我們又一次啟動短信任務的時候就看不到這個撥號界面了。
Activity的親和力是由taskAffinity屬性定義的。Task的親和力是通過讀取當前任務根Activity的親和力決定的。
因此。依據定義。根Activity總是位於同樣親和力的任務裏。因為在某些需求的要求下,一些Activity的啟動模式(由launchModel屬性定義)為singleTask和singleInstance,此類Activity僅僅能位於任務的底部。因此,想要使用allowTaskReparenting屬性來調整Activity所屬任務,則啟動默認僅僅能限於"standard"和"singleTop"這兩個模式。
2.android:alwaysRetainTaskState
該屬性表明該Activity所在任務的狀態是否由系統保存,假設是。則其值為true,假設配置為false。則表示在一定情況下Android將以初始狀態啟動該任務。該屬性的默認值是false。須要註意的是。該屬性僅對任務的根Activity起作用,其它的全部Activity都會被忽略。
當用戶又一次選擇顯示該任務的時候。系統在通常情況下將會清理掉任務中除了根Activity外的其它Activity。
這樣的情況一般是指用戶在一定時間限制內未對該任務進行操作,比如30分鐘內。反之假設該屬性配置為true時,系統總會以任務的最後狀態來顯示該任務,而無論用戶是怎樣返回的。
3.android:clearTaskOnLaunch
該屬性表明,除了任務中的根Activity,其它全部Activity是否都將從任務中移出。
假設想要在啟動時僅僅保留根Activity,則設置這個屬性的值為true,否則為false。 這個屬性的默認值是false。該屬性僅對啟動一個新任務的根Activity有意義。
當配置為true時,每當用戶再次啟動任務時。則總是由任務的根Activity來處理請求。
假設該屬性和allowTaskReparenting都是true,則可又一次成為父任務的不論什麽Activity就要被移動到具有同樣親和力的任務上。接著保留的Activity就被銷毀
4.android:configChanges
在某些設備配置(比方屏幕方向。字體大小,網絡類型等)發生變化的時候,Activity將會被又一次啟動以適配新的配置。這是系統行為。而Android相同為應用程序提供了一個阻止這樣的行為發生的手段,假設你不想由於某種配置變化而發生Activity重新啟動,則能夠通過配置這個屬性並選擇你想要阻止的配置。假設你配置完成並選擇了你關註的配置,則當這些配置發生改變的時候Activity不會重新啟動,而是通過onConfigurationChanged()回調方法通知應用程序這些配置發生了變化。
註意:如非必要。應該避免使用該屬性
下表列出了該屬性的有效值,要設置多個的時候,用“|”切割開就可以。
值 | 描寫敘述 |
mcc | IMSI移動國家代碼改變----SIM中的MCC信息被更新 |
mnc | IMSI移動網絡代碼----SIM的MNC信息被更新 |
locale | 語言環境已改變----用戶通過設置功能選擇了一種新語言觸屏發生變化 |
touchscreen | 觸屏發生變化 |
keyboard | 鍵盤類型已改變----比如,用戶接入了一個外部鍵盤 |
keyboardHidden | 鍵盤可見性已改變 |
screenLayout | 屏幕布局已改變 |
fontScale | 字體縮放因素已改變-----用戶通過設置模塊選擇了新的字體大小 |
uiMode | 用戶界面模式已改變-----在用戶將設備放究竟座上的時候,或者夜間模式改變的時候,就會引起用戶界面的改變 |
Orientation | 屏幕方向已改變----用戶翻轉了設備 註意:假設應用程序是定位於API Level13或者更高,則也應聲明screenSize配置。由於當設備在橫向和縱向之間切換時,它也會改變 |
screenSize | 當前可用的屏幕尺寸已改變,這表明在當前可用的尺寸中的變化。關系到當前的長寬比。當用戶在橫向和縱向間切換時,也會發生這樣的情況。可是。假設應用程序定位於API Level12或者更低時,那麽Activity將總是自行處理該配置。 |
smallestScreenSize | 物理屏幕尺寸已改變。 這表明在尺寸上的改變。無論方向怎樣,也僅僅在實際的物理屏幕尺寸改變(如轉換到外部顯示)時才會改變。對該配置的改動響應了smallestWidth配置中的一個改變。可是,假設應用程序定位於API Level12或者更低,則Activity總是自行處理對該配置的改動 |
全部這些配置的改變都能影響到應用程序對資源文件的選擇。所以。當onConfigurationChanged()被調用時,通常須要又一次獲取全部的資源(包含視圖布局和圖片等),以便正確地處理這些改變。
須要註意的是,假設我們沒有實現onConfigurationChanged()回調,那麽該Activity就會被銷毀並又一次創建。
5.android:enabled
一般來說,每個Activity由Activity框架負責實例化,但你能夠通過配置該屬性來限制系統的這樣的行為。
該屬性表示Activity能否被實例化,為true表示由系統實例化,否則為false。該屬性默認值是true。
對於每個Activity的子類。在它首次執行之前總要進行實例化。這個步驟是必須的。我們能夠使用這個屬性來控制Android框架實例化Activity的行為,但這樣做是有風險的,所以不建議你這樣做。
6.android:excludeFromRecents
Android框架為我們維護了一個名叫“近期執行”的應用程序列表,以方便進行應用程序切換。該屬性表示應用程序是否應該將Activity從近期執行的應用程序列表排除,假設排除。則為true。否則為false。
該屬性的默認值為false。這個屬性的前提是該Activity是某個任務的根Activity。
7.android:exported
該屬性表示Activity能否夠由其它應用程序中的組件來啟動,假設能夠。則為true,否則為false。
假設為false,則該Activity僅僅能由同一應用程序的組件或者有相同用戶ID的應用程序來啟動。
值得註意的是,假設你試圖從你的應用程序中啟動其它應用程序組件,在沒有使用該屬性的情況下,你必須以新任務(newTask)的方式啟動
8.android:finishOnTaskLaunch
該屬性是指無論何時,當用戶再次啟動Activity的任務時(在主頁屏幕上選擇該任務)。是否應銷毀(或者終止)這個Activity的實例。假設應銷毀,則為true,否則為false.該屬性的默認值是false。
9.android:hardwareAccelerated
該屬性是指是否應為該Activity啟動硬件加速,假設應啟動,則為true,否則為false。
默認值是false。
註意:不是全部的OpenGL 2D操作都會被加速。假設啟用硬件加速渲染器。則要測試你的應用程序以便確保它能使用渲染器而不會產生錯誤。
10.android:icon
它代表Activity和圖標。在Activity被顯示的時候,就用該圖標顯示給用戶。
比如。用於演示樣例任務的Activity的圖標,或者桌面上的圖標。
該屬性必須設置為圖片資源引用。假設沒有設置。就使用<application>節點上的icon屬性。
11.android:label
該屬性用於描寫敘述該Activity的一個標簽,一般是隨著Activity圖標一起顯示出來的。
假設沒有設置該屬性,則使用<application>節點上的label屬性設置的值。
12.android:launchMode
這個屬性描寫敘述了該Activity應該怎樣被啟動。在Intent對象中。與Activity標誌一起工作的模式有4種,各自是:standard,singleTop,singleTask和singleInstance。默認模式是standard。
例如以下表。模式有兩類。一類是standard和singleTop。還有一類是singleTask和singleInstance。有standard和singleTop啟動模式的Activity可多次被實例化。
使用的情況 | 啟動模式 | 多個實例? | 備註 |
通常啟動模式 | standard | 是 | 默認。系統總是在目標任務中創建Activity的一個新實例而且將intent按順序放入到實例中。 |
singleTop | 有條件的 | 假設Activity的實例已經存在於目標任務的頂部。則系統通過調用onNewIntent()方法將intent發送到該實例上。而不是創建Activity的一個新實例 | |
特殊啟動模式 | singleTask | 否 | 系統在新任務的根上創建該Activity。假設已經存在實例,則系統通過調用onNewIntent()方法來將intent發送到該Activity上,它同意在這個Activity為根的任務中創建新的Activity |
singleInstance | 否 | 和singleTask一樣。除了系統不啟動不論什麽其它Activity到持有實例的任務上,Activity總是單個的,並且是其任務的唯一成員 |
相反,singleTask和singleInstance這兩種模式下的Activity僅僅能啟動一個任務它們一直待在Activity棧的根上。此外。設備一次僅僅保存Activity的一個實例。
standard和singleTop模式僅僅在一個方面上是不同的。在satndard模式下,每次都會實例化一個Activity新實例來響應這個Intent,每一個實例處理一個intent。
與此相似的是。singleTop模式下的Activity的新實例也可被創建來處理新的intent。
可是。假設目標任務在其棧的頂部已經有Activity的一個實例。則會使用這個已經存在的Activity的實例來處理這個intent(回調onNewintent()方法)。而不會創建一個新實例。在其它情況下,假設singleTop模式下的Activity的一個已存在實例在目標任務中而非棧的頂部。或者假設它在棧的頂部而非目標任務中。就會創建一個新實例並將它壓倒Activity棧頂上。
singleTask和singleInstance模式也相同存在不同的啟動特性。
singleTask模式下的Activity同意其它Activity成為它的任務的一部分,它總是在自身任務的根上,可是其它Activity能夠被啟動到該任務中。
還有一方面,singleInstance模式下的Activity不同意其它Activity成為其任務的一部分。它是任務中唯一的Activity。假設它啟動了還有一個Activity,則該Activity就被分配到不同的任務上,好比FLAG_ACTIVITY_NEW_TASK在intent中一樣。
13.android:multiprocess
該屬性表示Activity的實例能否夠執行在啟動它的組件所在的應用程序進程中。假設能夠,則為true,否則為false。其默認值是false。
14.android:name
該屬性表示Activity的類名,它是Activity的子類,其屬性值應該是一個標準的Java類名(如com.example.liyuanjing.ManiActivity)。我們也能夠將其標識為類的縮寫。比方名稱的首字母是一個點(比如.ManiActivity),那麽它就被追加<manifest>元素指定的包名,從而變成com.example.liyuanjing.ManiActivity(如果包名為com.example.liyuanjing)。
這點全然由系統完畢,我們不須要關心這個過程的細節,但這個屬性是必須配置的,而且不提供默認值。
15.android:noHistory
這個屬性用於設置在用戶離開該Activity。而且它在屏幕上不再可見的時候,是否應該從Activity的堆棧中刪除。假設應該刪除,則為true。否則為false。默認值是false。
true意味著Activity將不會留下歷史痕跡。它將不會為任務而在Activity棧中保留數據,所以用戶將不能返回到Activity上。
16.android:permission
表示的是權限名稱。假設startActivity()或者startActivityForResult()的調用者還沒有被授予指定的權限。則啟動失敗。
假設該屬性沒有設置,則<application>元素的permission屬性設置的權限就應該應用到Activity中。假設這兩個屬性都沒有設置,則Activity就不會被權限保護。
17.android:process
該屬性表示該Activity執行的進程名稱。
通常。應用程序的全部組件在為應用程序而創建的默認進程中執行。<application>元素的process屬性能夠為全部組件設置一個不同的進程。可是每一個組件能夠覆蓋這個屬性的值,這樣就實現了將應用程序部署在多個進程間。
假設分配該屬性的名稱是以冒號(:)開頭,則在須要新進程而且Activity在該進程中執行的時候,就會創建一個對於應用程序私有的新進程。
18.android:screenOrientation
該屬性表示Activity顯示的方向(比方縱向,橫向),它是值能夠是下表中的隨意一個字符。
取值 | 說明 |
unspecified | 默認值,依據重力感應選擇方向 |
user | 用戶當前偏好的方向 |
behind | 和Activity同樣的方向 |
landscape | 橫向 |
portrait | 縱向 |
reverseLandscape | 與正常橫向相反方向 的橫向 |
reversePortrait | 與正常縱向相反方向的縱向 |
sensorLandscape | 僅僅能是橫向,可是能夠依據重力感應來決定是正常的還是反轉的橫向 |
sensorPortrait | 中能是縱向。可是能夠依據重力感應來決定是正常的或者反轉的縱向 |
sensor | 方向由設備方向感應器來決定。顯示的方向取決於用戶是怎樣持有設備的;在用戶翻轉設備時,方向發生改變。有些設備在默認情況下不會翻轉到全部4個可能的方向。要同意可翻轉到全部4個方向,能夠使用fullSensor |
fullSensor | 方向由設備方向感應為4個方向中的隨意一個而確定 |
nosensor | 無感應模式 |
19.android:stateNotNeeded
該屬性表明Activity能否被終止以及能否在還沒有保存其狀態的情況下成功重新啟動。
假設Activity能夠在不須要引用到之前狀態的情況下就能被重新啟動,則該屬性為true;假設須要引用到之前的狀態才幹被重新啟動。則為false。默認值是false。
通常,在臨時關閉Activity之前,我們要調用onSaveInstanceState()方法來保存當前的Activity的狀態。該方法在Bundle對象中存儲Activity的當前狀態,該對象在重新啟動Activity時將會以參數的方式傳給onCreate()方法。假設該屬性被設置為true,則onSaveInstanceState()就不會被調用。而且onCreate()會被傳遞null。這和Activity首次啟動時所做的一樣。
20.android:taskAffinity
該屬性指明對該Activity有親和力的任務。有相同親和力的Activity在概念上屬於同一任務(默認情況下是應用程序所定義的任務)。任務的親和力是由其根Activity的親和力所決定的。
21.android:theme
該屬性是指為Activity定義一個總體主題風格資源的引用。
所謂的風格包含字體種類,總體樣式等。使用該屬性能夠使得我們的Activity在總體上更為統一,美觀。
假設沒有設置該屬性,則Activity繼承將應用程序作為一個總體而設置的主題。詳細可見<application>元素的theme屬性。假設theme屬性也沒有設置,則使用默認系統主題。
22.android:windowSoftInputMode
該屬性表示Activity的主窗體怎樣與包括屏幕軟鍵盤的窗體交互。
設置該屬性將影響兩件事。
①軟鍵盤的狀態。當Activity獲取輸入焦點時,是否隱藏軟鍵盤。
②對Activity主窗體的調整。該窗體是否被調整得更小一些來為軟鍵盤騰出空間,或者它的內容是否被移動以便在部分窗體被軟鍵盤覆蓋時,使得當前焦點可見。
該屬性或者是下表的一個值,或者是state...值和adjust...值的組合。假設是多個值的組合。則使用(|)將其隔開,比如
<activity android:windowSoftInputMode="stateVisible|adjustResize" .....>
這裏設置的值(stateVisible和adjustResize)覆蓋了設置在主題中的值。
值 | 描寫敘述 |
stateUnspecified | 沒有指定的軟鍵盤(是否隱藏或者可見)的狀態。 系統將選擇一個合適的狀態或者依賴主題中的定義來設置。這對於軟鍵盤的行為是默認設置。 |
stateUnchanged | 軟鍵盤保持在它最後存在的不論什麽狀態中 |
stateHidden | 在用戶選擇Activity時,軟鍵盤是可見的 |
stateAlwaysHidden | 當Activity有輸入焦點時(比方編輯框獲得焦點的時候),軟鍵盤總是隱藏的。 |
stateVisible | 當用戶進入Activity的主窗體時,軟鍵盤是可見的 |
stateAlwaysVisible | 當用戶選擇Activity時。軟鍵盤可見 |
adjustUnspecified | Activity的主窗體是否調整尺寸來為軟鍵盤騰出空間 |
adjustResize | Activity的主窗體總是被調整來為屏幕上的軟鍵盤騰出空間 |
adjustPan | Activity的主窗體不會被調整為屏幕上的軟鍵盤騰出空間 |
Android清單文件具體解釋(六) ---- <activity>節點的屬性