1. 程式人生 > 實用技巧 >Activity的啟動模式

Activity的啟動模式

什麼是啟動模式呢?

我們的Activity是由系統建立的,我們編寫xxxActivity直接或者間接繼承自Activity,然後我們是沒有自己建立的,只是配置了一下即可。

Activity由系統建立啟動的時候,有幾種模式,我們把這幾種模式叫做Activity的啟動模式。

Activity啟動模式有那些呢?

在android中,Activity的啟動模式有四種,分別是:

– standard,標準模式 – singleTop,單一棧頂模式 – singleInstance,單例模式 – singleTask,單任務模式

接下來,我們會通過程式碼和圖例的形式來學習一下啟動模式,已及啟動模式的應用場景。

正文開始

Activity從它的架構和設計上來說,是非常優秀的想法,流行於大多數的移動作業系統中。不管怎麼樣,Activity不僅僅是隻跑介面這麼簡單,它是怎麼載入的也是非常值得我們去研究一下的。

在這篇文章裡頭會有很多內容,其中最重要的就是載入模式(LaunchMode)這個就是我們今天重點討論的話題了。

每個Activity獲取它有不同的作用,多數情況下,我們使用標準的啟動模式即可,但是有些特殊情況,比如說,我的主介面只能有一個,不管是誰啟動我這個主介面,它在棧裡就只有一個例項,這種情況下,我們就需要把這個Activity的啟動模式設定成singleInstance了。

如何指定Activity的啟動模式呢?

最基本最直接的方式就是直接修改AndroidManifest.xml裡的屬性配置即可,比如說:

前面我們知道,有且僅有四種啟動模式,讓我們一個一個地來看吧!

Standard標準模式

標準啟動模式,也是預設的啟動模式。

如果在AndroidManifest.xml檔案裡設定了這個啟動模式(其實可以不設定,預設就是這個啟動模式),每開啟一個被設定的Activity,就會建立新的物件。

驗證程式碼:

第一個Activity去啟動一個新的Activity,這個Activity每1秒鐘就啟動一下新的Activity,啟動5個就完事了。

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private int time = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Handler handler = new Handler();
        handler.post(new Runnable() {

            @Override
            public void run() {
                if (time < 5) {
                    startActivity(new Intent(MainActivity.this, NewActivity.class));
                    Log.d(TAG, "start new activity...");
                    time++;
                    handler.postDelayed(this, 1000);
                }
            }
        });

    }
}

第二個介面的程式碼如下,做了一個小動作,就是每個介面的建立,就會設定一下隨機的背景顏色。

/**
 * Created by TrillGates on 2018/2/2.
 */

public class NewActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);
        RelativeLayout container = (RelativeLayout) this.findViewById(R.id.container);
        Random random = new Random();
        int colorValue = random.nextInt();
        container.setBackgroundColor(colorValue);
    }

}

把NewActivity的啟動模式設定成standard,不設定也可以,因為預設就是這個啟動模式。

        <activity
            android:name=".NewActivity"
            android:launchMode="standard"
            android:theme="@style/AppTheme"/>

然後我們把這個應用跑起來,看現象:

以上動圖,需要重新開始看哈,是這樣子的。首先是點選開啟,從上面的程式碼我們知道。一開啟以後,第一個Activity就會每一秒開啟一個新的Activity,開啟5個。然後我點選了返回鍵,也就是關閉當前的Activity,可以發現我們一直關閉了5個介面才回到開始的hello介面,這個過程的動作是怎麼樣的呢?

它是這麼進入任務站的:

也就是逐個建立進入任務棧,當我們點選返回鍵的時候呢? 就變成這樣子了:

基本的啟動模式,是最簡單的,也是最常用的。在棧裡的順序是先進後出,後進先出。由於畫圖的原因,我們應該理解為這個棧為一個箱子,只有頂部的出口。

SingleTop模式

具體演示請看視訊吧,singleTop的意思則是如果要 啟動的任務已經在棧的頂部了,則不會再去建立新的任務,也就是說,假設ActivityB是singleTop,當前棧頂已經是ActivityB了,則不會去建立ActivityB。

使用場景:如果這個任務是比較被動的,比如說,瀏覽器的收藏夾,可以被javaScript的程式碼控制,比如說通知,可以被拉起來的這些,比較被動的任務,則使用SingleTop模式,防止被多次建立。如果已經在頂部了,或者我們可以理解為已經聚焦了,就沒必要再建立了。

SingTask模式

singTask,是會保證在這個棧裡,只有一個目標任務。假設說,我們生命了ActivityB為singleTask,那麼在任務棧裡,只有一個ActivityB。當我們要開啟ActivityB時有以下兩種情況:

第一種情況:任務棧裡沒有,就建立,放在棧頂。

第二種情況:任務棧裡有這個ActivityB,則不會建立,並且把ActivityB以上的任務,全部出棧,保證ActivityB在頂部。

使用場景:假設我們這個任務,要佔比較多的記憶體開銷,就會使用SingleTask的模式來保證它在棧裡只有一個。

SingleInstance模式

這個SIngleInstance牛逼,比前面三種模式都牛逼。

SingleInstance模式怎麼牛逼呢?前面三種模式,都是在同一個任務棧裡的,但是這個SingleInstance自己獨佔一個任務棧,建立誰就把誰直接放到程式最前面。