啟動模式一共四種徊哑,分別是standard
,singleTop
,singleTask
,singleInstance
,可以在AndroidManifest.xml通過<activity>標簽指定android:launchMode屬性來選擇啟動模式
standard
這個是默認的啟動模式,在不進行指定的模式下僧界,就會用這個模式歧杏,在這個模式下砰碴,每當啟動一個新的活動九榔,他就會在返回棧中入棧兽埃,并處于棧頂?shù)奈恢媒那到y(tǒng)不會在乎這個活動是否已經(jīng)在返回棧中存在,每次啟動都會創(chuàng)建該活動的一個新的實例
- 修改MainActivity中的方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("MainActivityaaaaaaaa",this.toString());
Button but_1 = (Button)findViewById(R.id.but_1);
but_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
在MainActivity中啟動MainActivity柄错,當點擊兩次這個按鈕的時候它就會創(chuàng)建兩個實例舷夺,這個時候得連續(xù)按兩次Back鍵才可返回
singleTop
在啟動這個模式的時候如果發(fā)現(xiàn)返回棧中的棧頂已經(jīng)是該活動的時候,則認為可以直接使用它
- 先修改一下AndriidManifest.xml中的代碼
<activity android:name=".MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
-
保持主頁面代碼不變
這個時候無論點擊多少次按鈕都不會有新的打印信息出現(xiàn)售貌,因為MainActivity已經(jīng)是返回棧的棧頂了给猾,這個模式下只會有一個實例,盡按一次Back鍵就可以了
- 但是颂跨,此時的MainActivity不是位于棧頂?shù)奈恢玫臅r候敢伸,在啟動MainActivity的時候還是會創(chuàng)建新的實例
先修改MainActivity中的代碼
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("MainActivityaaaaaaaa",this.toString());
Button but_1 = (Button)findViewById(R.id.but_1);
but_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
}
});
}
這次進入的是Main2Activity中,修改Main2Activity中的代碼
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Button but_1 = (Button)findViewById(R.id.but_1);
but_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Main2Activity.this,MainActivity.class);
startActivity(intent);
}
});
}
在Main2Activity中進入MainActivity恒削,這個時候就是從第一個頁面進入第二個頁面池颈,再從第二個頁面進入第一個頁面
這個時候可以看到系統(tǒng)創(chuàng)建了兩個不同MainActivity實例尾序,這個是因為在第二個頁面中在啟動第一個頁面的時候,這時的棧頂活動已經(jīng)是第二個界面了躯砰,因此會創(chuàng)建一個新的第一個頁面的實例每币,此時,必須按四次返回鍵才可以退出
singleTask
這個模式就是解決上一個活動遺留的問題琢歇,如果該活動并沒有處于棧頂?shù)哪J嚼嫉。€是可能會創(chuàng)建多個實例的,當活動的啟動模式是singleTask的時候矿微,每次啟動的時候系統(tǒng)首先會在返回棧中檢查是否有這個活動痕慢,如果有的話就直接使用該實例,沒有的話就會創(chuàng)建一個新的
<activity android:name=".MainActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
現(xiàn)在重新點擊程序涌矢,在主頁面中點擊按鈕進入第二個頁面掖举,再從第二個頁面中點擊按鈕進入到第一個頁面,此時只會有一個實例
可以看出娜庇,無論點擊多少次塔次,就會產(chǎn)生一個實例,按一次Back鍵就會退出程序
singleinstance
指定為這個模式的活動會啟動一個新的返回棧來管理這個活動
- 假設(shè)我們的程序中有一個活動是允許其他程序調(diào)用的名秀,如果想實現(xiàn)其他程序和我們的程序可以共享這個活動的實例励负,這個時候該怎么實現(xiàn)呢,使用前面三種是肯定不行的匕得,因為每一個程序都會有自己的返回棧继榆,同一個活動在不同的返回棧中入棧的時候必然是創(chuàng)建了新的實例,而使用這個模式的話就可以解決這個問題汁掠,在這個模式下會有一個單獨的返回棧來管理這個活動略吨,不管是哪一個程序來訪問這個活動,都會公用同一個返回棧考阱,也就解決共享活動的實例
- 修改AndroidManidest翠忠,此時修改的是Main2Activity(第二個頁面)
<activity android:name=".Main2Activity"
android:launchMode="singleInstance">
</activity>
- 修改MainActivity中的代碼
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//打印的是返回棧中的id
Log.d("MainActivitybbbbbb","Task id id"+getTaskId());
setContentView(R.layout.activity_main);
Button but_1 = (Button)findViewById(R.id.but_1);
but_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
}
});
}
- 修改Main2Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 同樣打印了當前返回棧中的id
Log.d("MainActivitybbbbbb","Task id id"+getTaskId());
setContentView(R.layout.activity_main2);
Button but_1 = (Button)findViewById(R.id.but_1);
but_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Main2Activity.this,Main3Activity.class);
startActivity(intent);
}
});
}
- 修改Main3Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//獲取當前返回棧的id
Log.d("MainActivitybbbbbb","Task id id"+getTaskId());
setContentView(R.layout.activity_main3);
}
運行程序,重第一個頁面進入第二個頁面乞榨,再從第二個頁面進入第三個頁面
可以看到第二個頁面的id不同于其他的頁面秽之,這說明第二個頁面存放在一個單獨的返回棧中,而這個棧中只有這一個活動
- 此時按下Back鍵返回吃既,從第三個頁面就直接返回到了第一個頁面考榨,再按Back鍵,會跳到第二個頁面鹦倚,這是為什么呢董虱?
因為此時的第一個頁面和第三個頁面是在一個返回棧中,在第三個頁面中按下Back,第三個頁面出棧愤诱,第一個頁面就位于棧頂了云头,再按下Back,當前的返回棧已經(jīng)空了淫半,于是就顯示了另一個返回棧溃槐,就是第二個頁面,再按下Back科吭,這時所有的返回棧就空了昏滴,也就退出了程序