2017年7月15日 星期六

Android:Activity的四種啟動模式

在多Activity開發中,有可能是自己應用之間的Activity跳轉,或者夾帶其他應用的可復用Activity。

可能會希望一個Activity跳轉到原來某個Activity實例,而不是產生大量重複的Activity。

這需要為Activity配置特定的啟動模式,而不是使用默認的啟動模式。


Activity有四種啟動模式:
  • standard(預設)
  • singleTop
  • singleTask
  • singleInstance
設置的位置在AndroidManifest.xml文件中的<activity>標籤裡設定android:launchMode屬性:

<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有多個


2.singleTop模式:

    singleTop和standard模式,都會將intent發送新的實例
如果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」則限制只生成一個實例

  • 是否允許其它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,它會每次都被重用。

沒有留言:

張貼留言