一、先看看文檔里怎麼說 Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your...
一、先看看文檔里怎麼說
Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your
AndroidManifest.xml's <application> tag, which will cause that class to be instantiated for you when the process for your application/package is created.
Application 類是用來維護應用程式全局狀態。你可以提供自己的實現,併在 AndroidManifest.xml文件的 <application> 標簽中指出他的名字,這將導致在創建應用程式時去實例化你自己的 Application 類。
Android系統會為每個程式運行時創建一個Application類的對象且僅創建一個,所以Application可以說是單例 (Singleton)模式的一個類。且 Application 對象的生命周期是整個程式中最長的,它的生命周期就等於這個程式的生命周期。因為它是全局唯一的,所以在不同的Activity,Service中獲得的對象都是同一個對象。所以通過 Application 來進行一些:數據傳遞、數據共用、數據緩存等操作。
二、重寫 Application 類的生命周期事件
public void onCreate()
在應用程式創建的時候被調用,可以實現這個這個方法來創建和實例化任何應用程式狀態變數或共用資源。還可以在這個方法裡面得到 Application 的單例。
public void onTerminate ()
當終止應用程式對象時調用,不保證一定被調用,當程式是被內核終止以便為其他應用程式釋放資源,那麼將不會提醒,並且不調用應用程式的對象的onTerminate方法而直接終止進程。
public void onLowMemory()
當系統資源匱乏的時候,我們可以在這裡可以釋放額外的記憶體, 這個方法一般只會在後臺進程已經結束,但前臺應用程式還是缺少記憶體時調用。可以重寫這個方法來清空緩存或者釋放不必要的資源。
public void onTrimMemory(int level)
當運行時決定當前應用程式應該減少其記憶體開銷時(通常在進入後臺運行的時候)調用,包含一個 level 參數,用於提供請求的上下文。
public void onConfigurationChanged (Configuration newConfig)
與 Activity 不同,配置改變時,應用程式對象不會被終止和重啟。如果應用程式使用的值依賴於特定的配置,則重寫這個方法來載入這些值,或者在應用程式級處理配置值的改變。
三、通過 Application 傳遞數據
假如有一個Activity A, 跳轉到 Activity B ,並需要傳遞一些數據,通常的作法是 Intent.putExtra() 讓Intent攜帶,或者有一個Bundle把信息加入Bundle讓Intent傳遞Bundle對象,實現傳遞。但這樣 有一個問題在於,Intent 和 Bundle 所能攜帶的數據類型都是一些基本的數據類型,如果想實現複雜的數據傳遞就比較麻煩了,通常需要實現 Serializable 或者 Parcellable 介面。這其實是Android的一種IPC數據傳遞的方法。如果我們的兩個Activity在同一個進程當中為什麼還要這麼麻煩呢,只要把需要傳遞的對象的引用傳遞過去就可以了。
基本思路是:在 Application 中創建一個 HashMap ,以字元串為key,Object為value這樣我們的 HashMap 就可以存儲任何類型的對象了。在Activity A中把需要傳遞的對象放入這個HashMap,然後通過 Intent 或者其它途徑再把這 key 傳遞給Activity B ,Activity B 就可以根據這個字元串在 HashMap 中取出這個對象了。只要再向下轉型 ,就實現了對象的傳遞。、
四、Application 數據緩存
我一般會習慣在 Application 中建立兩個 HashMap 一個用於數據的傳遞(見三),一個用於緩存一些數據。比如有一個Activity需要從網站獲取一些數據,獲取完之後我們就可以把這個數據先存到Application 當中,當頁面跳轉到其它 Activity 再回來的時候,就可以直接使用緩存好的數據了。但如果需要cache一些大量的數據,最好是cache一些 (軟引用)SoftReference ,並把這些數據cache到本地Rom 上或者 SDCard上。如果在 Application 中的緩存不存在,從本地緩存查找,如果本地緩存的數據也不存在再從網路上獲取。
裝模作樣的聲明一下:本博文章若非特殊註明皆為原創,若需轉載請保留原文鏈接(http://www.cnblogs.com/kest/p/5137328.html)及作者信息k_est