編輯:關於android開發
自己的理解加上網上的一些資料總結了關於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中的信息。
這個模式比較麻煩,我也解釋不好,能力有限,大家看看截圖看看代碼自己理解吧。
本文自己胡亂杜撰的,如有雷同純屬巧合(那些原理示意圖是網上找的)
本人不承擔任何看不懂不理解寫錯的風險!!!
Android 異步Http框架簡介和實現原理,android框架在前幾篇文章中《Android 采用get方式提交數據到服務器》《Android 采用post方式提交數
自己定制ListView,上拉刷新和下拉刷新,加載網絡圖片,並且添加緩存機制。,自己定制listview 1 package com.lixu.listviewrefr
Xamarin Android 應用程序內圖標上數字提示,xamarinandroid最近在用 Xamarin 做一個 Android 應用,打開應用時,如果有新消息,需
Android安全專項之Xposed劫持用戶名密碼實踐 Xposed是個強大的工具,可以hook所有的java方法,下面用Xposed來截獲App的用戶名密碼,默