【android】task和back stack

來源:互聯網
上載者:User
文章目錄
  • 基本概念
  • foreground task和background task
  • Activity的多重執行個體
  • 管理task和back stack
http://coolxing.iteye.com/blog/1279606基本概念

task是一系列activity的集合, 這些activity通常因為同一目的而啟動, 系統將這些activity按照建立的順序組織在棧中(也就是所謂的back stack). 每一個task都擁有一個僅屬於它的back stack.

例如一個連絡人app, 當建立一個連絡人時, 需要為這個連絡人指定頭像. 這時會啟動圖片瀏覽器選擇一張圖片作為頭像, 選擇完成之後切換回連絡人app. 在這個過程中, 至少會啟動2個activity, 系統會將這2個activity安排在同一個task中, 給使用者的感覺就好像是這2個activity是屬於同一個app的.

home screen是大多數task建立的場所. 當使用者點擊home screen的app表徵圖時, 通常會建立一個task, 並將該app的"main activity"作為back stack中的root元素. 如果當前activity啟動了另一個activity, 新的activity會被壓入back stack中並獲得焦點. 前一個activity仍然在back stack棧中, 但處於stopped狀態. 一個處於stopped狀態的activity在記憶體中存有它的狀態資料.

如果使用者點擊back鍵, 當前activity將從back stack中彈出並被系統銷毀(調用了onDestroy()方法), 棧中的前一個activity成為新的棧頂元素並獲得焦點(它的狀態資料不會丟失).

棧中的activity不會有重新排序的機會, back stack只是簡單的壓入或彈出activity--當前activity啟動了新的activity時將新的activity壓入棧中, 當使用者點擊back鍵時彈出當前的activity, 僅此而已.

如果使用者不停的點擊back鍵, back stack中的activity將不斷從棧中彈出, 直到回到home screen. 當棧中所有的activity都已出棧時, 這個back stack和task將不複存在.

是一個簡單的樣本:      

foreground task和background task

         Task可以分為foreground task和background task. 當使用者按下home鍵時, 當前task就會從foreground task變成background task. 如果一個task變為background task, 那麼棧中的所有activity都將處於stopped狀態. Task也可以從background task恢複為foreground task, 比如使用者在home screen介面中再次點擊某個task根項目的activity的表徵圖.示範了2個task的情形: 如果使用者重新點擊了activity1的圖片, 那麼task A將重新成為foreground task, 而且task A中的activity3將恢複為運行狀態.

         Background task中的所有activity均處於stopped狀態, 而foreground task中除棧頂activity之外的其他activity也處於stopped狀態, 系統可能由於記憶體不足的緣故摧毀後台activity—這可能導致資料的丟失. 關於如何防止資料丟失, 請參考我的另一篇博文http://coolxing.iteye.com/blog/1279447. 如果一個後台activity被系統摧毀, 其在棧中的位置仍然保留著, 當使用者按下back鍵定位到已被摧毀的activity時, 會重建這個activity.

Activity的多重執行個體

一個activity可能會被多次執行個體化, 這些activity的執行個體化對象可能存在與同一個task中, 也可能存在於不同的task中.

的HomeActivity用於2個執行個體, 且這2個執行個體存在於同一個task中.

如果開發人員不希望一個activity存在多個執行個體對象, 可以在androidManifest.xml檔案中進行配置, 或者通過Intent的Flag屬性進行設定.

管理task和back stack

由系統自動管理的task和back stack通常情況下可以很好的工作, 開發人員不應該介入. 如果出於某些特殊的考慮需要介入對task和back stack的管理, android也提供了相應的途徑:可以為androidManifest.xml檔案的<activity>標籤設定相應的屬性, 也可以給啟動activity的intent設定flag屬性. 如果同時設定了2者, 那麼將以intent的flag屬性為準.

在manifest檔案中設定launch mode

<activity>標籤的launchMode屬性的值可能為:

1. “standard”, launchMode屬性的預設值. 表示該activity啟動後將壓入當前back stack中, 該activity可以存在多重執行個體, 這些多重執行個體既可以分布在不同的task中, 也可以分布在同一個task中.

2. “singleTop”. 表示啟動該activity時, 如果這個activity已經是當前task的棧頂activity, 那麼將不再建立新的activity, 其餘情形同”standard”. 例如某個task中包含4個activity, 分別為A-B-C-D, activity D處於back stack的棧頂, 且D的launchMode屬性為”singleTop”. 如果此時再次啟動了activity D, 由於activity D已經處於棧頂, 此時不會再次建立activity D的執行個體, 當前back stack中擁有的activity仍然是A-B-C-D. 但是如果D的launchMode為”standard”, 那麼會再次建立新的activity D的執行個體, 並將其壓入棧中, back stack中擁有的activity將變化為A-B-C-D-D.

3. “singleTask”. 表示啟動該activity時, 如果這個activity尚未在任何task中存在執行個體, 將建立一個task, 然後把該activity壓入這個新的task中. 如果在某個task中已經存在一個該activity的執行個體對象, 將不再建立這個activity, 但是activity所在的task將成為foreground task.

4. “singleInstance”. 與”singleTask”類似, 不同的是”singleInstance”的activity所在的task不能擁有其他activity.

設定intent的flag屬性

通過startActivity()方法啟動一個activity需要一個intent, 設定intent的flag屬性可以指定待啟動的activity的launchMode. Intent的flag屬性的可選值有:

1. FLAG_ACTIVITY_NEW_TASK. 對應值為“singleTask”的launchMode.

2. FLAG_ACTIVITY_SINGLE_TOP. 對應值為” singleTop”的launchMode.

3. FLAG_ACTIVITY_CLEAR_TOP. 在launchMode中不存在對應的值. 表示如果待啟動的activity已經在當前task的back stack中, 那麼不再建立該activity的執行個體對象, 並將銷毀棧中所有位於該activity之前的activity.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.