Android activity的啟動模式
自己的理解加上網上的一些資料總結了關於activity的四種啟動模式
在實際項目中我們應該根據特定的需求 為每個活動指定恰當的啟動模式。啟動模式一共有四種,分別是 standard、singleTop、 singleTask 和 singleInstance,可 以在 AndroidManifest.xml 中通 過給標籤 指定 android:launchMode屬性來選擇啟動模式。
1,standard(這是活動的一個標準模式,在建立活動的時候預設是這個模式)
在 standard模式下,每當啟動一個新的活動,它就會在返回棧中入棧,並處於棧頂的位置。對於使用 standard模式的活動,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會建立 該活動的一個新的執行個體。接下來通過一段代碼來瞭解一下。
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity", this.toString());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, FirstActivity.class);
startActivity(intent);
} });
}
我個人認為代碼跟應該挺清晰的說明了問題所在,所以我就不再說明了。
2,singleTop
使用singleTop模式。當活動的啟動模式指定為 singleTop,在啟動活動時如果發現返回棧的棧頂已經是該活動,則認為可以直接使用它,不會再建立新的活動執行個體。
現在在AndroidManifest.xml中修改Activity的啟動模式(android:launchMode="singleTop")
然後重新運行程式,查看 LogCat
我個人認為代碼跟應該挺清晰的說明了問題所在,所以我就不再說明了。
3, singleTask
當活動的啟動模式指定為 singleTask,每次啟動該活動時系統首先 會在返回棧中檢查是否存在該活動的執行個體,如果發現已經存在則直接使用該執行個體,並把在這 個活動之上的所有活動統統出棧,如果沒有發現就會建立一個新的活動執行個體。
現在在AndroidManifest.xml中修改Activity的啟動模式(android:launchMode="singleTask")
然後在 FirstActivity中添加 onRestart()方法,並列印日誌:
@Override protected void onRestart() {
super.onRestart();
Log.d("FirstActivity", "onRestart");
}
最後在 SecondActivity中添加 onDestroy()方法,並列印日誌:
@Override protected void onDestroy() {
super.onDestroy(); Log.d("SecondActivity", "onDestroy");
}
現在重新運行程式,在 FirstActivity 介面點擊按鈕進入到 SecondActivity,然後在 SecondActivity介面點擊按鈕,又會重新進入到 FirstActivity。
然後重新運行程式,查看 LogCat
4,singleInstance
singleInstance模式應該算是四種啟動模式中最特殊也最複雜的一個了,指定為 singleInstance模式的活動會啟用一 個新的返回棧來管理這個活動。
我也不好解釋,什麼都不說了,上代碼。
先修改 AndroidManifest. xml中 SecondActivity的啟動模式(android:launchMode="singleInstance")
FirstActivity 中 onCreate()方法的代碼:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity", "Task id is " + getTaskId());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
} }); }
在 onCreate()方法中列印了當前返回棧的 id。然後修改 SecondActivity中 onCreate()方法 的代碼:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity", "Task id is " + getTaskId());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
startActivity(intent);
}});
}
同樣在 onCreate()方法中列印了當前返回棧的 id,然後又修改了按鈕點擊事件的代碼, 用於啟動 ThirdActivity。最後修改 ThirdActivity中 onCreate()方法的代碼:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("ThirdActivity", "Task id is " + getTaskId());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.third_layout);
}
仍然是在 onCreate()方法中列印了當前返回棧的 id。現在重新運行程式,在 FirstActivity 界 面 點 擊 按 鈕 進入 到 SecondActivity, 然 後 在 SecondActivity 界 面 點 擊 按 鈕 進入 到 ThirdActivity。運行程式,看LogCat中的資訊。
這個模式比較麻煩,我也解釋不好,能力有限,大家看看看看代碼自己理解吧。
本文自己胡亂杜撰的,如有雷同純屬巧合(那些原理是網上找的)
本人不承擔任何看不懂不理解寫錯的風險!!!