天天看點

Android--Task和BackStack進階

開始一個Task

  之前已經了解到,Android的Task通常起始于HOME頁面下點選應用程式圖示或其在桌面快捷圖示。是以我們在開發一個應用程式的時候,需要指定應用程式的入口Activity,通過在AndroidManifest.xml清單檔案中某個<Activity/>标簽内,使用<intent-filter/>标簽内指定。需要設定action為"android.intent.action.MAIN",設定category為"android.intent.category.LAUNCHER"。

<a></a>

  這樣,當使用者點選應用程式圖示之後,就會以這個入口Activity為基礎,建立一個任務(Task),而這個Activity為這個Task中的第一個Activity,稱為根Activity。

  Android中存在多個Task,但是同一時刻隻有一個Task被置于前台,其它的均為背景,而背景的Task内的Activity,均為Stopped狀态。Android系統中有多種方式切換Task,比如:按HOME鍵回到桌面、長按HOME鍵切換到其他Task等。而在同一個Task中,也隻有BackStack最上面的Activity處于獲得焦點的狀态,其它也為Stopped,每當系統需要把Activity置于Stopped時,都會自動在Bundle中保其内控件的狀态資料(需要為控件設定ID辨別),比如:控件輸入值、滾動條位置,以便下次獲得焦點的時候自動還原。

  但是有一種特殊的情況,對Android系統的記憶體管理有了解的朋友都應該知道,當系統資源不足的時候,如記憶體不足,會自動回收一些優先級比較低的元件的線程,以釋放資源給新的元件使用。那麼就存在問題了,當一個Task被切換到背景之後,如果系統資源告急,自動銷毀了某個背景Task中的Activity(除了根Activity外),當使用者再次切換回那個Task的時候,BackStack中存在這個Activity的标記,但是記憶體中已經不存在這個Activity的執行個體了,這個時候,系統就會通過Bundle來重新建立一個Activity用于還原它,這樣保證了使用者體驗,使使用者還是感覺在之前的頁面中操作。但是這種情況下,Bundle是不會儲存之前Activity中的資訊的,比如:控件輸入值、滾動條位置。這個時候,如果這個Activity的内容很重要的話,需要我們以編碼的方式去儲存資料,并在重新建立的時候,以編碼的方式還原這個資料。

  以上兩種情況都需要用到兩個Activity的生命周期方法,onSaveInstanceState()和onRestoreInstanceState()。但是第一種情況是系統幫我們維護的,第二種特殊情況,需要開發人員編碼維護。下面是這兩個方法的簽名:

protected void onSaveInstanceState(Bundle outState):當Activity被系統回收的時候被調用 ,用這個方法儲存Activity中需要儲存的資料,存入outState參數即可。

protected void onRestoreInstanceState(Bundle savedInstanceState):當Activity被系統恢複的時候被調用,從Bundle中取出資料,設定會控件中,當然也可以通過重寫onCreate()方法來設定資料,因為onCreate()一樣可以擷取到,但是推薦使用onRestoreInstanceState()。

  上面描述的Activity被系統回收已經之後在還原的情況,為預設情況。在Android系統的清單檔案中,不光為我們提供了設定啟動模式的屬性android:LauncherMode,還為我們提供了Activity的清理模式,有如下幾個:

android:alwaysRetainTaskState:這個屬性隻對根Activity有效,預設為false,當其設定為true的時候,當這個根Activity失去焦點被置于背景的時候,如不出現意外情況,其中的Activity将不會被系統回收。

android:clearTaskOnTask:這個屬性隻對根Activity有效,當這個根Activity失去焦點被置于背景的時候,會清理BackStack中根Activity之上的所有Activity,并在下次獲得焦點的時候顯示根Activity。

android:finishOnTaskLaunch:這個屬性隻應用于單個Activity,它預設為false,當其設定為true的時候,目前Task如果在這個Activity獲得焦點的時候被切換到背景,那麼這個Activity直接被銷毀,哪怕隻是離開一小會兒。

總結

  自此就把Task和BackTask的内容介紹完了,把Task和BackStack了解透徹了,對android應用開發有非常好的作用。可以有效提高使用者體驗,應用中的Activity應該如何顯示,應該長存(singleInstance),還是應該閱後即焚(finishOnTaskLaunch),等等場景。一款應用不應僅僅是功能的實作,還需要注重使用者體驗,它不僅僅是一款應用,而是應該把它當成一款産品來開發。

本文轉自承香墨影部落格園部落格,原文連結:http://www.cnblogs.com/plokmju/p/android_TaskStackHight.html,如需轉載請自行聯系原作者

繼續閱讀