可能會希望一個Activity跳轉到原來某個Activity實例,而不是產生大量重複的Activity。
這需要為Activity配置特定的啟動模式,而不是使用默認的啟動模式。
Activity有四種啟動模式:
- standard(預設)
- singleTop
- singleTask
- singleInstance
<activity android:name=".MainActivity"
android:launchMode="standard">
或是透過Intent來設定
Intent intent = new Intent(this, B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
通常當一個Activity1啟動時,會把該Activity1放入一個Task裡,如果當有Activity2被啟動時,也會被放入Activity1所在的Task,以堆疊的方式來存放Activity,然後當使用者按下返回健或程式執行finish()時,該Activity就會從Task裡移除
然而有的時候我們的需求可能是,當產生新的Activity時,把它上入新的Task裡;或者希望將已存在的Activtiy拿到Task頂部來使用,而不是產生一個新的。
下面介紹4種Activity的啟動模式:
1. standard模式:
首先說standard模式,也就是默認模式,不需要配置launchMode。
這種模式下,如果重複創建同一個Activity實例,intent將發送給新的實例。即同一個Activity有多個
這種模式下,如果重複創建同一個Activity實例,intent將發送給新的實例。即同一個Activity有多個
2.singleTop模式:
singleTop和standard模式,都會將intent發送新的實例
如果Task的頂部已經存在了該Activity,那麼,它便不會重新創建,而是調用 onNewIntent。如果,該Activity存在,但不是在頂部,那麼該Activity依然要重新創建。
如果Task的頂部已經存在了該Activity,那麼,它便不會重新創建,而是調用 onNewIntent。如果,該Activity存在,但不是在頂部,那麼該Activity依然要重新創建。
3.singleTask模式:
如果在Task已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到Task頂部,因此在它上面的實例將會被移除棧。如果Task中不存在該實例,將會創建新的實例放入棧中。
4.singleInstance模式:
加載該Activity时如果没有實例化,他會創建新的Task后,實例化Activity放入Task,如果已經存在,直接調用 onNewIntent,該Activity的Task中不允許啟動其它的Activity,任何從該Activity動的其他Activity都將被放到其他task中
「standard」和「singleTop」可以被實例化多次,並且是可以存在於不同的task中;這種實例化時一個task可以包括一個activity的多個實例;「singleTask」和」singleInstance」則限制只生成一個實例
「singleInstance」獨占一個task,其它activity不能存在那個task里,如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task里運行,而另外三種模式,則可以和其它activity共存。
「standard」對於每一個啟動Intent都會生成一個activity的新實例;「singleTop」的activity如果在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,否則,生成該activity的實例;「singleTask」 如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前台。 當已經存在的activity實例處理新的intent時候,會調用onNewIntent方法;「singleInstance」是其所在棧的唯一activity,它會每次都被重用。
- 是否允許多個實例
「standard」和「singleTop」可以被實例化多次,並且是可以存在於不同的task中;這種實例化時一個task可以包括一個activity的多個實例;「singleTask」和」singleInstance」則限制只生成一個實例
- 是否允許其它activity存在於本task內
「singleInstance」獨占一個task,其它activity不能存在那個task里,如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task里運行,而另外三種模式,則可以和其它activity共存。
- 是否每次都生成新實例
「standard」對於每一個啟動Intent都會生成一個activity的新實例;「singleTop」的activity如果在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,否則,生成該activity的實例;「singleTask」 如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前台。 當已經存在的activity實例處理新的intent時候,會調用onNewIntent方法;「singleInstance」是其所在棧的唯一activity,它會每次都被重用。
沒有留言:
張貼留言