Android Application詳解和使用
能爬上金字塔頂峰的只有兩種動物,雄鷹和蝸牛,我既然做不了雄鷹,就做一隻蝸牛吧。
研究一個新的東西,從哪幾方面開始,我覺得可以從這幾方面:
- 它是什麼,有什麼屬性
- 它能幹什麼
- 怎麼方便高效的使用它
好了,一步步來研究,要有足夠的耐心和毅力,不怕出錯,就怕停滯不前。
一、Application是什麼
用於儲存全域性應用狀態的基礎類,可以提供自己的實現,自定義實現必須繼承Application類,並且在AndroidManifest.xml中的application標籤的name屬性中設定你的實現類,Application是全域性單例,一個客戶端應用從開始到結束只有一個例項。
方法:
- onConfigurationChanged(Configuration newConfig)
Called by the system when the device configuration changes while your component is running.
當應用程式執行中,系統配置發生改變時,系統回撥用此方法
- onCreate()
Called when the application is starting, before any activity, service, or receiver objects (excluding content providers) have been created.
當應用程式啟動,在任何activity、service、receiver物件被建立之前建立之前被呼叫。
- onLowMemory()
This is called when the overall system is running low on memory, and actively running processes should trim their memory usage.
當整個Android系統處於低記憶體執行時呼叫,並且活躍的程序會釋放他們的記憶體
- onTerminate()
This method is for use in emulated process environments.
這個方法被用來模擬程序環境,真機上時不會呼叫此方法的。
- onTrimMemory(int level)
Called when the operating system has determined that it is a good time for a process to trim unneeded memory from its process.
當Android系統在恰當的時候削減一個程序的記憶體時被呼叫
- registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback)
註冊activity生命週期回撥的方法
- registerComponentCallbacks(ComponentCallbacks callback)
Add a new ComponentCallbacks to the base application of the Context, which will be called at the same times as the ComponentCallbacks methods of activities and other components are called.
註冊元件的回撥方法
- registerOnProvideAssistDataListener(Application.OnProvideAssistDataListener callback)
- unregisterActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback)
- unregisterComponentCallbacks(ComponentCallbacks callback)
- unregisterOnProvideAssistDataListener(Application.OnProvideAssistDataListener callback)
二、Application能幹什麼
如果你的應用程式沒有寫自定義的Application,當應用啟動的時候,也會建立一個預設的Application,Application的建立,其目的用於儲存全域性應用狀態的資訊,而且是單例模式,生命週期貫穿整個應用的執行。基於這一點,我們可以利用它的全域性單例,儲存一些系統執行時的狀態資訊,和資料操作的動作。蒐羅網上的方法和結合自己的使用,總結如下:
- 使用者登入資訊儲存
- Activity之前資料的傳遞,在Application中維護一個Map
解析:
- 對於第一點,使用Application儲存資料,是一個普遍的做法,這種方式方便快捷,便於管理,而且充分運用了Application的全域性單例的特性。
- 在Application中維護一個Map來實現Intent傳遞資料,好處是可以傳一些Intent不支援的資料型別,比如Bitmap、類(未實現Serializable介面的類)型別。
但是,這裡有一個大大的但是,以上會出現下面的問題。
- 當應用程式因為記憶體吃緊,在後臺關掉App後,使用者再一次開啟App時,Android會重新建立一個之前被Kill掉的Application例項並恢復上次使用者開啟的Activity,這時的Application是全新的,之前儲存的所有資料都為空,所以如果繼續從Application中取值,會因取不到值出錯而崩掉。
- 在Application中維護Map和List儲存資料和管理Activity的引用,這樣帶來的壞處是如果內容不被使用了,這些物件不能被回收,因為這裡維護的都是強引用,長此以往,會導致記憶體不斷升高。
解決辦法:
- 通過Intent在Activity之間來傳遞資料(但是請別傳遞大量資料,這有可能導致程式異常或者ANR)
- 使用官方推薦的方法中的一種將資料持久化,儲存在磁碟中;
- 在使用資料和控制代碼的時候做空值檢測;