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自己獨佔一個任務棧,建立誰就把誰直接放到程式最前面。