活動的啟動模式 – 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
活動的啟動模式