1. 程式人生 > >activity的四種載入模式和它們的區別

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中進行設定,<activity>中的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的<activity>元素的特性值互動控制。

下面是影響載入模式的一些特性

核心的Intent Flag有: 
FLAG_ACTIVITY_NEW_TASK 
FLAG_ACTIVITY_CLEAR_TOP 
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 
FLAG_ACTIVITY_SINGLE_TOP 

核心的<activity>特性有: 
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鍵返回到這之前的狀態。