原創(chuàng)作品,轉(zhuǎn)載請(qǐng)注明出處O
Activity 的啟動(dòng)模式有四種征候,standard寞酿、singleTop、singleTask、singleInstance.
1.standard
standard是Activity默認(rèn)的啟動(dòng)模式该园,在不進(jìn)行顯示指定的情況下酸舍,所有活動(dòng)都會(huì)自動(dòng)使用這種啟動(dòng)模式。
每次啟動(dòng)都一個(gè)新的Activity位于棧頂里初。
android:launchMode="standard",此時(shí)每次點(diǎn)擊按鈕都會(huì)創(chuàng)建新的Activity
現(xiàn)在啃勉,我們寫(xiě)一個(gè)簡(jiǎn)單的按鈕 ,實(shí)現(xiàn)跳轉(zhuǎn)Activity
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("MainActivity",this.toString());
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent);
}
});
}
雖然跳轉(zhuǎn)的頁(yè)面相同双妨,但是在Task中每點(diǎn)一次按鈕就會(huì)創(chuàng)建一個(gè)新的Activity
2.singleTop
當(dāng)Activity的啟動(dòng)模式為singleTop時(shí),當(dāng)啟動(dòng)的Activity已經(jīng)處于Activity棧頂時(shí)淮阐,則直接使用。
android:launchMode="singleTop"
我們創(chuàng)建NextActivity,并且在MainActivity中添加button2
private Button button1,button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("MainActivity", this.toString());
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button1:
Intent intent = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent);
break;
case R.id.button2:
Intent intent2 = new Intent(this, NextActivity.class);
startActivity(intent2);
break;
}
}
此時(shí)在MainActivity中啟動(dòng)MainActivity,則Activity棧中只會(huì)創(chuàng)建一次;但是先啟動(dòng)NextActivity之后再啟動(dòng)MainActivity,則會(huì)創(chuàng)建新的MainActivity,因?yàn)榇藭r(shí)的Activity棧頂是NextActivity
3.singleTask
當(dāng)活動(dòng)的啟動(dòng)模式為singleTask時(shí)刁品,啟動(dòng)該Activity會(huì)現(xiàn)在棧中檢查是否已存在泣特,若存在則直接將該活動(dòng)之上的Activity全部出棧。
android:launchMode="singleTask"
4.singleInstance
singleInstance模式下會(huì)有一個(gè)單獨(dú)的返回棧來(lái)管理活動(dòng)挑随。不管哪個(gè)應(yīng)用程序來(lái)訪問(wèn)該活動(dòng)状您,都共用同一個(gè)棧,這樣就可以允許其他程序調(diào)用镀裤,實(shí)現(xiàn)共享該活動(dòng)竞阐。
android:launchMode="singleInstance"
圖中啟動(dòng)的過(guò)程是:Main -> New -> Next 這個(gè)過(guò)程很容易看懂
返回過(guò)程是:Next -> Main -> New
明顯看出順序不一樣,為什么會(huì)出現(xiàn)這種情況呢暑劝?
NextActivity和MainActivity處于同一個(gè)棧骆莹,當(dāng)我們返回時(shí),NextActivity出棧担猛,此時(shí)棧A中還存在MainActivity,并且處于棧頂幕垦,所以會(huì)看到MainActivity.
當(dāng)MainActivity執(zhí)行返回時(shí),棧A會(huì)清空傅联,然后我們就看到了位于棧B的NewActivity先改。
之后NewActivity出棧,棧B也為空時(shí)蒸走,App退出仇奶。
Activity的啟動(dòng)模式簡(jiǎn)單介紹到這里, 希望對(duì)您有所幫助,有不足或者錯(cuò)誤的地方請(qǐng)指正比驻。
每星期至少一篇跟新本系列该溯,感興趣可以關(guān)注。
一起學(xué)習(xí)别惦,一起進(jìn)步狈茉。
demo下載內(nèi)附APK鏈接:https://pan.baidu.com/s/1dFakVPf 密碼:adti