1. 程式人生 > >Android基礎_活動_啟動模式

Android基礎_活動_啟動模式

瞭解了活動的生命週期就必須瞭解一下活動的啟動模式,活動的啟動並沒有看起來startActivity(new Intent(A.this, B.class))那麼簡單。

活動的啟動模式分為4種:standard、 singleTop、 singleTask、 singleInstance

有兩種指定方式:

1) AndroidManifest.xml中

<activity android:name="com.hgstatuschange.SIMChange"
          android:launchMode="singleInstance" />
2) .Java中
Intent mIntent = new Intent(context, SIMChange.class);    
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);

接下來詳細介紹一下這4中啟動模式

1) standard(預設的)

當我們在程式碼沒有對活動的啟動模式進行顯式指定時,活動的啟動方式就是預設的standard。Android是在返回棧中來管理活動的,在此啟動模式下,每當啟動一個新的活動,它就會在返回棧中入棧,並且置於棧頂位置。系統不會關心返回棧中是否已經存在了此活動。重複啟動某個活動,需要重複back才能完全退出程式。

2) singleTop

當用此方式啟動一個活動時,如果要啟動的活動已經在返回棧頂了,則會直接使用該活動而不建立新的活動,因此返回棧中只有一個該活動的例項。如果要啟動該活動時,返回棧中有此活動但不在返回棧頂,那麼還是會建立一個新的活動,返回棧中便會出現多個該活動的例項。

3) singleTask

使用singleTop模式可以很好地解決重複建立棧頂活動的問題,但是正如你在2)中所看到的,如果該活動並沒有處於棧頂的位置,還是可能會建立多個活動例項的。而singleTask可以讓某個活動在整個應用程式的上下文中只存在一個例項。當活動的啟動模式指定為singleTask,每次啟動該活動時系統首先會在返回棧中檢查是否存在該活動的例項,如果發現已經存在則直接使用該例項,並把在這個活動之上的所有活動統統出棧,如果沒有發現就會建立一個新的活動例項。

例子:我們建立了活動A、B。返回棧中存在A和B,B處於棧頂位置,這時候我們在B中啟動A,可以發現A沒有執行onCreate()而執行了onRestart()。B執行了onDestroy()被銷燬了。

4) singleInstance

singleInstance模式應該算是四種啟動模式中最特殊也最複雜的一個了,你也需要多花點功夫來理解這個模式。不同於以上三種啟動模式,指定為singleInstance模式的活動會啟用一個新的返回棧來管理這個活動(其實如果singleTask模式指定了不同的taskAffinity,也會啟動一個新的返回棧)。那麼這樣做有什麼意義呢?想象以下場景,假設我們的程式中有一個活動是允許其他程式呼叫的,如果我們想實現其他程式和我們的程式可以共享這個活動的例項,應該如何實現呢?使用前面三種啟動模式肯定是做不到的,因為每個應用程式都會有自己的返回棧,同一個活動在不同的返回棧中入棧時必然是建立了新的例項。而使用singleInstance模式就可以解決這個問題,在這種模式下會有一個單獨的返回棧來管理這個活動,不管是哪個應用程式來訪問這個活動,都共用的同一個返回棧,也就解決了共享活動例項的問題。