1. 程式人生 > >Android Application詳解和使用

Android Application詳解和使用

能爬上金字塔頂峰的只有兩種動物,雄鷹和蝸牛,我既然做不了雄鷹,就做一隻蝸牛吧。

研究一個新的東西,從哪幾方面開始,我覺得可以從這幾方面:

  1. 它是什麼,有什麼屬性
  2. 它能幹什麼
  3. 怎麼方便高效的使用它

好了,一步步來研究,要有足夠的耐心和毅力,不怕出錯,就怕停滯不前。

一、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的建立,其目的用於儲存全域性應用狀態的資訊,而且是單例模式,生命週期貫穿整個應用的執行。基於這一點,我們可以利用它的全域性單例,儲存一些系統執行時的狀態資訊,和資料操作的動作。蒐羅網上的方法和結合自己的使用,總結如下:

  1. 使用者登入資訊儲存
  2. Activity之前資料的傳遞,在Application中維護一個Map

解析:

  1. 對於第一點,使用Application儲存資料,是一個普遍的做法,這種方式方便快捷,便於管理,而且充分運用了Application的全域性單例的特性。
  2. 在Application中維護一個Map來實現Intent傳遞資料,好處是可以傳一些Intent不支援的資料型別,比如Bitmap、類(未實現Serializable介面的類)型別。

但是,這裡有一個大大的但是,以上會出現下面的問題。

  1. 當應用程式因為記憶體吃緊,在後臺關掉App後,使用者再一次開啟App時,Android會重新建立一個之前被Kill掉的Application例項並恢復上次使用者開啟的Activity,這時的Application是全新的,之前儲存的所有資料都為空,所以如果繼續從Application中取值,會因取不到值出錯而崩掉。
  2. 在Application中維護Map和List儲存資料和管理Activity的引用,這樣帶來的壞處是如果內容不被使用了,這些物件不能被回收,因為這裡維護的都是強引用,長此以往,會導致記憶體不斷升高。
解決辦法:
  1. 通過Intent在Activity之間來傳遞資料(但是請別傳遞大量資料,這有可能導致程式異常或者ANR)
  2. 使用官方推薦的方法中的一種將資料持久化,儲存在磁碟中;
  3. 在使用資料和控制代碼的時候做空值檢測;