1. 程式人生 > >Activity 啟動模式及任務棧管理

Activity 啟動模式及任務棧管理

什麼是任務棧

Android系統中,Activity代表一個個視窗,負責直接和使用者進行互動。一個應用包含很多的視窗即Activities,同時可以從這個應用去開啟存在於其他應用中的activities例如從Photo應用要分享一張照片到朋友圈,則會通過當前的Photo應用啟動微信APP。為了實現多個應用的無縫對接體驗,Android系統使用任務棧(back stack)來對Activities進行管理。
一個任務是使用者在執行某種工作時所需要的activities的集合。Android系統使用任務棧(back stack)來對Activities進行管理 ,任務棧是一種“後進先出”的棧結構。預設情況下,當我們啟動一個Activity時,系統會建立一個Activity例項,並將其入棧;每按下一次back鍵就會有一個Activity出棧,直到棧空為止,當棧中無任何Activity時,系統會回收這個任務棧。以下展示了activities在stack中的行為變化。
這裡寫圖片描述

啟動模式

我們知道在預設情況下,啟動一個Activity,就會重新建立這個Activity並將其壓入任務棧棧頂並顯示,但這麼做會有一個問題:當我們多次啟動同一個Activity時,系統會重複建立多個例項,導致系統資源的浪費,顯然需要提供一種方法來控制Activity啟動時是否要建立新例項,若不需要建立則該從哪個任務棧中獲取該Activity例項,這就是啟動模式的作用。
啟動模式簡單地說就是Activity啟動時的策略,可以通過設定manifest中activity的lanchMode屬性或者通過傳到startActivity()的intent的flag來設定。啟動模式包括standard、singleTop、singleTask、singleInstance四種:

standard

標準模式,也是系統的預設模式。每次啟動Activity時,都會重新建立一個新的例項,並放入任務棧。比如說我們啟動一個LauchModeActivity1,指定該Activity的啟動模式為standard,然後通過startActivity重新再啟動LauchModeActivity1,我們可以通過adb shell dumpsys activity activities 來觀察當前的任務棧狀態:
這裡寫圖片描述
我們可以看出,前臺任務棧的taskAffinity值為com.example.myandroiddemo, taskId為84,當前棧中共有四個Activity,Run#0為棧底、Run#3為棧 頂,在stardard模式下,每次啟動LauchModeActivity1時,都會重新建立一個新的例項,並放入當前任務棧。

singleTop

棧頂複用模式。當啟動一個Activity時,此Activity預設會進入啟動它的Activity所屬的任務棧中,在建立之前,會先判斷當前任務棧頂是否存在該Activity例項。若存在,那麼此Activity不會被重新建立,同時它的onNewIntent方法會被呼叫;若不存在,則重新建立此Activity並壓入棧頂。比如說還是LauchModeActivity1啟動自身的例子,當前的任務棧狀態為:
這裡寫圖片描述

singleTask

棧內複用模式。這是一種單例項模式,在這種模式下,只要Activity在任務棧(多個)中存在,就不會重新建立例項,系統會回撥其onNewIntent。當啟動一個app時,一般情況下都會新建一個任務棧,每個任務棧都會有一個標識taskAffinity,預設taskAffinity為當前應用的包名,我們可以在Activity裡單獨指定taskAffinity屬性。當啟動一個singleTask的Activity時,首先會先根據taskAffinity 查詢是否存在當前Activity所需的任務棧,若不存在則新建一個任務棧;然後在全部的任務棧內查詢是否存在此Activity的例項,若不存在就新建一個壓入相關的任務棧,若存在則先判斷找到的Activity所在的任務棧和所需的任務棧是否是同一個:若是同一個就直接將找到的Activity之上的activities彈出即可,若不是則除了彈出在其之上的activities,還需將此Activity壓入所需的任務棧中。比如說,通過LauchModeActivity1啟動LauchModeActivity2,然後再通過LauchModeActivity2啟動LauchModeActivity1,當LauchModeActivity1設定為singleTop時的任務棧狀態為:
這裡寫圖片描述
可以看到一共產生了4個Activity例項,同屬於任務棧com.example.myandroiddemo。

當LauchModeActivity1設定為singleTask 時Activity的生命週期及相關的任務棧狀態為:
這裡寫圖片描述
這裡寫圖片描述
可以看到當通過LauchModeActivity2重新啟動LauchModeActivity1時,LauchModeActivity2被銷燬,LauchModeActivity1重新出現在棧頂中,並呼叫了onNewIntent方法,該任務棧始終只會存在LauchModeActivity1 f65b163這個例項,直至當前棧被清空。
接下來,我們來看一下taskAffinity的使用:通過LauchModeActivity1啟動LauchModeActivity2,然後再通過LauchModeActivity2啟動LauchModeActivity3,最後再通過LauchModeActivity3重新啟動LauchModeActivity1,設定LauchModeActivity1、LauchModeActivity3 為singleTask,併為LauchModeActivity3設定taskAffinity屬性:

<activity
    android :name= ".activity.LauchModeActivity1"
    android :launchMode= "singleTask" />

<activity
    android :name= ".activity.LauchModeActivity2" />

<activity
    android :name= ".activity.LauchModeActivity3"
    android :taskAffinity= "com.example.singletask"
    android :launchMode= "singleTask"/>

則其中Activity的生命週期切換及相關任務棧狀態為:
這裡寫圖片描述
這裡寫圖片描述
當從LauchModeActivity3重新啟動LauchModeActivity1時,所需任務棧為92,LauchModeActivity1位於任務棧91,所以首先彈出LauchModeActivity1之上的LauchModeActivity2,然後將LauchModeActivity1例項移動至LauchModeActivity3所在的任務棧。

singleInstance

單例項模式。一種加強的singleTask模式,除了具有singTask模式的特性,還包括具有此種模式的Activity只能單獨位於一個任務棧中。比如說還是上述例子,更改Activity的屬性為:

<activity
    android :name= ".activity.LauchModeActivity1"
    android :launchMode= "singleTask" />

<activity
    android :name= ".activity.LauchModeActivity2"
    android :launchMode= "singleInstance"/>

<activity
    android :name= ".activity.LauchModeActivity3" />

則其中Activity的生命週期切換及相關任務棧狀態為:
這裡寫圖片描述
這裡寫圖片描述

附錄

相關程式碼:本篇例子可在MyAndroidDemo中的Activity LauchMode中找到
參考資料:

相關推薦

Activity 啟動模式任務管理

什麼是任務棧 Android系統中,Activity代表一個個視窗,負責直接和使用者進行互動。一個應用包含很多的視窗即Activities,同時可以從這個應用去開啟存在於其他應用中的activities例如從Photo應用要分享一張照片到朋友圈,則會通過當前的

Activity啟動模式任務(Task)全面深入記錄(上)

任務棧簡單入門   最近又把兩本進階書看了一遍,但總感覺好記性不如爛筆頭,所以還是決定通過部落格記錄一下,我們將分兩篇來全面深入地記錄Activity 啟動模式與任務棧的內容。 android任務棧簡單瞭解 1. android任務棧又稱為Ta

Activity啟動模式任務以及使用場景

Activity的啟動模式、任務棧以及使用場景 目錄 Activity 生命週期 任務棧 啟動模式 Intent Flag taskAffinity屬性 一、 Activity作為最常用的四大元件之一,肯定都

Activity啟動模式任務(4)

 我們在開發專案的過程中,會涉及到該應用中多個Activity元件之間的跳轉,或者夾帶其它應用的可複用的Activity。例如我們可能希望跳轉到原來某個Activity例項,而不是產生大量重複的 Activity。這樣就需要我們為 Activity 配置特定的載入模式,而不是使用預設的載入模式。 Ac

Activity四種啟動模式任務(Task)總結分析

最近在總結android基礎問題 比如Activity的四種啟動模式  其中有涉及到任務棧的問題   之前都是一知半解   現在想著用筆記錄下來  可供自己以後參考 android任務棧簡單瞭解 1. android任務棧又稱為Task,它是一個棧結構,具有後進先出的特性

Activity啟動模式Intent的Flag屬性對Intent傳值的影響

前些時候在支援公司其它部門專案開發的時候,有同事問我:通過Intent在Activity之間進行資料傳遞,傳遞的Key和獲取的Key都沒錯,為什麼在目標Activity會獲取不到傳遞過來的資料?在Key沒錯的情況下獲取不到資料,那麼無疑是Activity的啟動模式及在跳轉時

Activity啟動模式&任務

Activity啟動模式設定:         <activity android:name=".MainActivity" android:launchMode="standard" /> Activity的四種啟動模式: 1. standard     

Activity 的幾種啟動模式應用場景

在一個專案中會包括著多個Activity,系統中使用任務棧來儲存建立的Activity例項,任務棧是一種“後進先出”的棧結構。舉個栗子,若我們多次啟動同一個Activity。系統會建立多個例項依次放入任務棧中。當按back鍵返回時,每按一次,一個Activity出棧,直到棧空

Android activity四種啟動模式taskAffinity屬性總結(附例子原始碼)

Android activity四種啟動模式總結本人目前在看 Android 開發藝術探索 這本書,書中對啟動模式的講解比較詳細,所以自己想總結下。如果各位能認真的看上一遍,相信會對android activity的啟動模式會有更加深刻的印象。Android啟動模式:   

Activity的四種啟動模式特點

1.Activity的啟動模式分別為: standard(預設啟動模式) singleTop singleTask singleInstance *porject檢視下啟動模式的修改在app>

Activity啟動模式的深入分析

啟用 ide net 啟動模式 soft adding class 任務 新的 網上關於Activity啟動模式的文章許多。可是看起來都千篇一律,看完之後我們都能理解這4種啟動模式。只是官方api對singleTask這個啟動模式解釋有些爭議,導致我事實

activity啟動模式之singleTop

att pear protect logs 實例 點擊 launch 操作 @override activity啟動模式之singleTop 一、簡介 二、設置方法 在AndroidManifest.xml中將要設置為singleTop啟動模式的頁面進行配置 <

Android Activity 啟動模式

.aspx art www 設置 instance ini cnblogs 順序 http Android啟動模式也就是Activity任務棧的運行模式:任務棧是用來存儲Activity的 在AndroidManifest.xml中的標簽

Android:圖解四種啟動模式 實際應用場景解說

類型 placed data val add The avi 能夠 per 在一個項目中會包括著多個Activity,系統中使用任務棧來存儲創建的Activity實例,任務棧是一種“後進先出”的棧結構。舉個栗子,若我們多次啟動同一個Activity。系統會創建多個實例依次放

android的singleInstance啟動模式方法呼叫

啟動模式;https://www.cnblogs.com/zhengtu2015/p/5053831.html 1 普及下知識 Activity啟動方式有四種,分別是: standard singleTop singleTask singleInstance 設定Activity

關於Activity啟動模式の學習

開始去學習Android的一些基礎的知識,開始從新做人,一步步腳踏實地的去了解這個系統 今天看的是關於Activity的啟動模式的文章,記下來防止自己遺忘了: Activity的啟動模式一共有四種,分別為standard,singleTop(棧頂模式),singleTask(複用模式),si

Activity啟動模式之SingleInstance

啟動模式系列之:Activity啟動模式(Standrd和SingleTop) 啟動模式系列之:Activity啟動模式(SingleTask) 啟動模式系列之:Activity啟動模式(SingleInstance) 一,SingleInstance模式(單例項模式)

探索Activity啟動模式

LifecycleActivity記為A,LifecycleActivity2記為B 一, Standard 略. 二, SingleTop 開啟App,啟動第一個Activity(A1),看到taskId == 2215 D/PRETTY_LOGGER: │ taskCou

Android-Activity啟動模式(launchMode)

Activity啟動模式是非常重要的一塊內容,啟動模式直接關係到使用者的體驗 和 效能的提升等   Activity啟動模式分為四種:      如果不配置:launchMode,預設就是:standard 標準的   standard 標準的   singleTop 獨佔頂端   s

Android-Activity啟動模式-應用場景

在上一篇部落格中,Android-Activity啟動模式(launchMode),就介紹了Activity四種啟動模式的特點與使用等,但是到底什麼樣子的場景,去使用什麼樣子的啟動模式呢     Activity啟動模式分為四種:      如果不配置:launchMode,預設