活動的啟動模式

活動的啟動模式 – standard

在實際專案當中,我們必須依照特定需求,為每個活動設定合適的啟動模式。

一共有四種啟動模式:

standard、singleTop、singleTask 與 singleInstance

可以在 AndroidManifest.xml 裡設定活動的 launchMode 屬性

standard 是預設的啟動模式

如果沒有額外指定,所有活動預設都使用這個模式

在這個模式下,每個新活動都會放在堆疊的最上方

系統不會檢查這個活動是否已經存在堆疊之中。

每次啟動都會建立該活動全新的實體

主活動 –> 一般活動 —> 開啟主活動(新實體)

針對這個新建立的主活動,系統不會理會原本的主活動實體

接下來我們實際演示看看

在主活動新增一個按鈕,在按鈕點擊事件裡透過 Intent 再次開啟主活動

問題?我們好像只要按一次返回就直接退出程式

大家知道這是什麼原因嗎?

如果哪位同學找到答案,可以跟大家分享。

活動的啟動模式 – singleTop

如果活動指定為 singleTop 啟動模式,啟動活動時系統會檢查返回堆疊的堆頂是否已經是這個活動;若是,就直接沿用現有實體,不會新建活動。

我們來試試看,在 AndroidManifest.xml 把主活動的 launchMode 屬性設成 singleTop

這時候不管點按按鈕多少次,都不會建立新的主活動,日誌只會輸出一次。

按一次返回鍵就能退出 Android 應用

但如果該活動不在堆疊頂端,系統仍然可以建立新的活動實體

我們接著修改 Intent,這次先開啟另一個活動,

再從第二個活動裡開啟主活動。

因為在第二個活動頁面時,堆疊頂端不是主活動,所以這時候會建立新的主活動實體。

I/Choreographer: Skipped 37 frames!  The application may be doing too much work on its main thread.Code language: HTTP (http)

前兩堂課「按返回直接回到桌面」的問題

原因是我們在按鈕事件裡多寫了一行 finish();

Log.e(TAG, this.toString()); 用來印出目前活動的記憶體位址

singleTask 模式

使用 singleTask 可以讓整個應用程式當中,只保留該活動單一個實體。

相較之下,singleTop 只保證堆疊頂端只存在一個實體。

singleInstance 模式與任務 Task

這個模式下,系統會另外建立獨立的返回堆疊來管理這個活動

舉例來說,我們有三個活動,把第二個活動的 launchMode 設為 singleInstance,第二個活動就會由另一個返回堆疊管理。

流程:從第一個活動進入第二個,再從第二個進入第三個。

從第三個活動按返回時,會先回到第一個活動,因為第一、第三個活動屬於同一個返回堆疊。

接著在第一個活動按返回,會切換到第二個活動。此時第一個活動所屬堆疊已經清空,系統會切換到另一個任務堆疊的堆頂,也就是活動二;再按一次返回就回到桌面。

public void onClick(View view){
    Intent it = new Intent(NormalActivity.this,Activity3.class);
    startActivity(it);
    finish();
}Code language: JavaScript (javascript)
05-13 08:14:26.890 4746-4746/com.foxdevelop.www.lifedemo E/主活動: 113
05-13 08:14:33.755 4746-4746/com.foxdevelop.www.lifedemo E/一般活動: 114
05-13 08:14:37.932 4746-4746/com.foxdevelop.www.lifedemo E/第三個活動: 113

活動的啟動模式

Previous:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *