Android啟動模式對activity行為的影響

來源:互聯網
上載者:User

http://515632.blog.51cto.com/505632/714705

其實除了啟動模式,還有intent的Flag和activity在manifest中定義的其它屬性也會影響activity的行為。

首先,我們必須要理解如下幾個概念。

一、task(任務):這裡面提到的任務與Android系統是個多任務的系統中的任務是不同的。後者更傾向於多進程和多線程來說的,而這裡的任務與application(應用程式)和activity(活動)有關係。Activity就不用說了,大家都知道這是與使用者互動的介面,是Android四大組件之一。容易引起困惑的是application,此應用程式是在Manifest中定義的,由多個activity組成的。而任務呢,也是涵蓋多個activity,而這些activity可以分屬不同的application。從activity的角度說,任務就是activity的集合,共同完成一項工作。這些activity排列在一個棧中,這就有了下面的概念,Back棧。

二、Back stack(後退棧):activity按照開啟的順序排列,形成的棧,通常我們也可以說是任務棧。如果使用者長時間離開task(比如30分鐘),系統會清理這個棧中除了根activity以外的所有activity,當使用者再次回來的時候,只有根activity在棧中。

其次,我把上述三個方面的內容羅列出來,方面大家查閱:

一、四大啟動模式:在manifest中定義的launchMode屬性,由於對activity的啟動行為影響重大,這裡單獨提出來說明。

android:launchMode=[“standard” | “singleTop” | “singleTask” |
“singleInstance”]

預設值是“standard”。

見之前的翻譯:http://blog.csdn.net/lincyang/article/details/6826021

一個Activity是“standard”或“singleTop”啟動模式,可以被執行個體化多次。

一旦有一個新的intent給“standard”activity,一個響應這個intent的新的執行個體就會被建立。每個執行個體會處理單獨的intent。相似的,一個“singleTop”activity的執行個體可能也會被建立去處理新的intent。然而,如果目標task已經存在一個此activity的執行個體在棧頂,這個執行個體會收到這個新intent(在onNewIntent中回調);新的執行個體就不會被建立了。在其他情況,舉個例子,如果一個已存在的“singleTop”activity執行個體在目標task 中,但沒有在棧頂,或者它在棧頂卻沒有在目標task中,一個新的執行個體就會被建立並且推進棧中。

“singleTask”和“singleInstance”模式只在一個方面有區別:“singleTask” activity允許其他activity成為task中的一部分 ,並且它通常在task棧的根部,其它activity(必須是“standard”和“singleTop”模式的activity)可以載入到這個棧上。另一方面,“singleInstance”模式的activity不允許任何其它activity載入到這個task棧上。它是這個task中唯一的activity。如果它啟動另一個activity,那個activity會被指引到不同的task中,這個行為就像在intent中用FLAG_ACTIVITY_NEW_TASK標記一樣。(linc註:通常來說,manifest中用“singleTask”啟動模式和在intent中用FLAG_ACTIVITY_NEW_TASK標記的行為是一樣的)。

二、Intent中activity相關的6個Flag比較重要:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_CLEAR_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_NO_HISTORY

FLAG_ACTIVITY_REORDER_TO_FRONT

1、 
FLAG_ACTIVITY_NEW_TASK

與啟動模式中的“singleTask”行為相同。

2、 
FLAG_ACTIVITY_SINGLE_TOP

與啟動模式中的“singleTop”行為相同。

3、  FLAG_ACTIVITY_CLEAR_TASK

必須要與FLAG_ACTIVITY_NEW_TASK配合使用,這個activity新啟動一個棧,原來棧被清空,棧中的activity也被銷毀。

4、  FLAG_ACTIVITY_CLEAR_TOP

A B C D四個activity在一個棧中,用此flag啟動B,原來的B被喚出來,CD被clear。不能與FLAG_ACTIVITY_SINGLE_TOP同用。可以和FLAG_ACTIVITY_NEW_TASK同用。

5、  FLAG_ACTIVITY_NO_HISTORY

當離開activity並不可見時,此activity會從棧中移除並不留下記錄。

6、  FLAG_ACTIVITY_REORDER_TO_FRONT

重新排列棧中activity的順序。如:棧中有A B C D四個activity,用此flag啟動B,原來的B被喚起到棧頂。重新排序後順序:A C D B

三、Activity的其他屬性:

android:allowTaskReparenting=["true"
| "false"]

android:alwaysRetainTaskState=["true"
| "false"]

android:clearTaskOnLaunch=["true"
| "false"]

android:finishOnTaskLaunch=["true"
| "false"]

android:noHistory=["true"
| "false"] 

android:taskAffinity="string"

這些屬性都是在Manifest中定義的,下面分別來介紹一下。

1、  先來說說 taskAffinity屬性:task的親屬關係,設定的字串應該是另一個task名,通常情況下是一個application的名稱。擁有相同taskAffinity的activity同屬於一個task,從使用者角度來看是屬於同一個應用程式(application)。一個task的親屬關係取決於task的根activity。

它是個很重要的屬性,它會配合其他屬性和flag共同影響activity的行為。首先它與“singleTask”模式或FLAG_ACTIVITY_NEW_TASK Flag配合,啟動後此activity會屬於另一個task,task名就是taskAffinity的設定值。其次,它會和allowTaskReparenting屬性配合使用,詳見allowTaskReparenting。

預設情況下,一個application中的所有activity同屬於一個親屬關係。如果想讓activity不屬於任一個task,那麼把taskAffinity的值設為空白吧。如果你不設它,那麼系統會為你預設為所屬application的名稱,也就是在manifest中的package名。

2、  allowTaskReparenting:與字面理解相同,本屬性允許activity重新指定Task。預設值是false。通常情況下我們不設定此屬性,activity在生命週期中只屬於一個Task。而設定成true後,需要與taskAffinity屬性配合使用,當原來的task轉到後台,親屬task轉到前台,那麼此時activity就會屬於當前的task。

3、  alwaysRetainTaskState:總是保留task的狀態。預設值是false。此時會遵循系統的清理棧的行為。如果設定為true,系統會保留棧中所有activity及其狀態,當使用者再次回來的時候,發現一切如初。

4、  clearTaskOnLaunch:當再次啟動task時,系統會清理掉除了根activity以外的所有activity。預設值是false。

5、  finishOnTaskLaunch:這個屬性與上面的clearTaskOnLaunch很像,不過它是指單個activity的,而不是整個棧。當設定為true時,task重啟後,這個activity就不顯示了。預設值為false。優先順序高於allowTaskReparenting。

6、  noHistory:如果設定true,當離開activity並不可見時,此activity會從棧中移除並不留下記錄。預設值為false。與上面FLAG_ACTIVITY_NO_HISTORY行為相同。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.