Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android activity的啟動模式

Android activity的啟動模式

編輯:關於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中的信息。

\

\

這個模式比較麻煩,我也解釋不好,能力有限,大家看看截圖看看代碼自己理解吧。

本文自己胡亂杜撰的,如有雷同純屬巧合(那些原理示意圖是網上找的)

本人不承擔任何看不懂不理解寫錯的風險!!!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved