Android activity的啟動模式

來源:互聯網
上載者:User

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中的資訊。

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.