在別人的部落格上看到了這篇文章,覺得寫得不錯就拿到自己這裡來參考學習下。
文章出處:http://mobile.51cto.com/android-266522_1.htm
應用程式組件都有一個生命週期,從響應Intent的Android執行個體開始到這個執行個體被銷毀。在這期間,他們或許有效或許無效,有效時或許對使用者可見或許不可見。下面我們就來討論四個基本組件的生命週期,包括在生命週期內的各種狀態,以及狀態之間的轉換。這幾種狀態可能的結果是:進程讓他們停止, 然後執行個體被銷毀。
Activity狀態 一般認為Activity有以下四種狀態:
活動的:當一個Activity在棧頂,它是可視的、有焦點、可接受使用者輸入的。Android試圖盡最大可能保持它活動狀態,殺死其它Activity來確保當前活動Activity有足夠的資源可使用。當另外一個Activity被啟用,這個將會被暫停。
暫停:在很多情況下,你的Activity可視但是它沒有焦點,換句話說它被暫停了。有可能原因是一個透明或者非全屏的Activity被啟用。
當被暫停,一個Activity仍會當成活動狀態,只不過是不可以接受使用者輸入。在極特殊的情況下,Android將會殺死一個暫停Activity來為活動的Activity提供充足的資源。當一個Activity變為完全隱藏,它將會變成停止。
停止:當一個Activity不是可視的,它“停止”了。這個Activity將仍然在記憶體中儲存它所有的狀態和會員資訊。儘管如此,當其它地方需要記憶體時,它將是最有可能被釋放資源的。當一個Activity停止後,一個很重要的步驟是要儲存資料和當前UI狀態。一旦一個Activity退出或關閉了,它將變為待用狀態。
待用: 在一個Activity被殺死後和被裝在前,它是待用狀態的。待用Acitivity被移除Activity棧,並且需要在顯示和可用之前重新啟動它。
activity的四種載入模式
在android的多activity開發中,activity之間的跳轉可能需要有多種方式,有時是普通的產生一個新執行個體,有時希望跳轉到原來某個activity執行個體,而不是產生大量的重複的activity。載入模式便是決定以哪種方式啟動一個跳轉到原來某個Activity執行個體。
在android裡,有4種activity的啟動模式,分別為:
standard: 標準模式,一調用startActivity()方法就會產生一個新的執行個體。
singleTop: 如果已經有一個執行個體位於Activity棧的頂部時,就不產生新的執行個體,而只是調用Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的執行個體。
singleTask: 會在一個新的task中產生這個執行個體,以後每次調用都會使用這個,不會去產生新的執行個體了。
singleInstance: 這個跟singleTask基本上是一樣,只有一個區別:在這個模式下的Activity執行個體所處的task中,只能有這個activity執行個體,不能有其他的執行個體。
這些啟動模式可以在功能資訊清單檔AndroidManifest.xml中進行設定,中的launchMode屬性。
相關的代碼中也有一些標誌可以使用,比如我們想只啟用一個執行個體,則可以使用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 標誌,這個標誌表示:如果這個activity已經啟動了,就不產生新的activity,而只是把這個activity執行個體加到棧頂來就可以了。
- Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
- startActivity(intent);
Activity的載入模式受啟動Activity的Intent對象中設定的Flag和manifest檔案中Activity的元素的特性值互動控制。
下面是影響載入模式的一些特性
核心的Intent Flag有:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP
核心的特性有:
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
四種載入模式的區別
所屬task的區別
一般情況下,“standard”和”singleTop”的activity的目標task,和收到的Intent的寄件者在同一個task內,就相當於誰調用它,它就跟誰在同一個Task中。
除非Intent包括參數FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK參數,會啟動到別的task裡。
“singleTask”和”singleInstance” 總是把要啟動的activity作為一個task的根項目,他們不會被啟動到一個其他task裡。
是否允許多個執行個體
“standard”和”singleTop”可以被執行個體化多次,並且是可以存在於不同的task中;這種執行個體化時一個task可以包括一個activity的多個執行個體;
“singleTask”和”singleInstance”則限制只產生一個執行個體,並且是task的根項目。
singleTop 要求如果建立intent的時候棧頂已經有要建立的Activity的執行個體,則將intent發送給該執行個體,而不建立新的執行個體。
是否允許其它activity存在於本task內
“singleInstance”獨佔一個task,其它activity不能存在那個task裡;
如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task裡運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。
而另外三種模式,則可以和其它activity共存。
是否每次都產生新執行個體
“standard”對於每一個啟動Intent都會產生一個activity的新執行個體;
“singleTop”的activity如果在task的棧頂的話,則不產生新的該activity的執行個體,直接使用棧頂的執行個體,否則,產生該activity的執行個體。
比如:
現在task棧元素為A-B-C-D(D在棧頂),這時候給D發一個啟動intent,如果D是 “standard”的,則產生D的一個新執行個體,棧變為A-B-C-D-D。
如果D是singleTop的話,則不會生產D的新執行個體,棧狀態仍為A-B-C-D
如果這時候給B發Intent的話,不管B的launchmode是”standard” 還是 “singleTop” ,都會產生B的新執行個體,棧狀態變為A-B-C-D-B。
“singleInstance”是其所在棧的唯一activity,它會每次都被重用。
“singleTask” 如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前台。 當已經存在的activity執行個體處理新的intent時候,會調用onNewIntent()方法,如果收到intent產生一個activity執行個體,那麼使用者可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,使用者不能通過按back鍵返回到這之前的狀態