Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android應用開發入門(五十六)Task和BackStack的高級內容介紹及應用

Android應用開發入門(五十六)Task和BackStack的高級內容介紹及應用

編輯:Android開發實例

前言

  之前的文章講到了Android下Activity的啟動模式,涉及到了Task和BackStack的內容,對這些不熟悉的朋友,可以先去看看:http://www.fengfly.com/plus/view-214091-1.html。本文主要講講Task和BackStack的高級內容。

  本文的內容包括:

  1. 開始一個Task
  2. BackStack回退時Activity狀態
  3. BackStack的清理

 

開始一個Task

  之前已經了解到,Android的Task通常起始於HOME頁面下點擊應用程序圖標或其在桌面快捷圖標。所以我們在開發一個應用程序的時候,需要指定應用程序的入口Activity,通過在AndroidManifest.xml清單文件中某個<Activity/>標簽內,使用<intent-filter/>標簽內指定。需要設置action為"android.intent.action.MAIN",設置category為"android.intent.category.LAUNCHER"。

  1. <activity ... > 
  2.     <intent-filter ... > 
  3.         <action android:name="android.intent.action.MAIN" /> 
  4.         <category android:name="android.intent.category.LAUNCHER" /> 
  5.     </intent-filter> 
  6.     ...  
  7. </activity> 

  這樣,當用戶點擊應用程序圖標之後,就會以這個入口Activity為基礎,創建一個任務(Task),而這個Activity為這個Task中的第一個Activity,稱為根Activity。

 

BackStack回退時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()。

BackStack的清理

  上面描述的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),等等場景。一款應用不應僅僅是功能的實現,還需要注重用戶體驗,它不僅僅是一款應用,而是應該把它當成一款產品來開發。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved