android中的Application類

在2011年做的一個iptv項目中就接觸了這個Application類,雖用起來簡單,但還是有些需要注意的地方。空閒之餘,總結如下:

android系統爲每個程序運行時創建一個Application類的對象,且application對象的生命週期就等於這個程序的生命週期。因爲它是全局的,單例的,所以在不同的Activity,Service中獲得的對象都是同一個對象。

通常我們不需要指定一個Application,系統會自動幫我們創建。如果需要創建自己的Application,只需創建一個類繼承 Application並在manifest的application標籤中進行註冊(在Application標籤增加個name屬性,並賦值自定義的 Application類的名字)。

Activity間的數據傳遞,通常的作法是使用Intent.putExtra(),讓Intent攜帶,或者有一個Bundle把信息加入Bundle讓Intent推薦Bundle對象,實現傳遞。但這樣作有一個問題,Intent和Bundle所能攜帶的數據類型都是一些基本的數據類型,如果想實現複雜的數據傳遞就比較麻煩了,通常需要實現 Serializable或者Parcellable接口。這其實是Android的一種IPC數據傳遞的方法。如果兩個Activity在同一個進程當中,爲什麼還要這麼麻煩呢?只要把需要傳遞的對象的引用傳遞過去就可以了。那用什麼辦法把對象的引用傳遞過去呢?

這時使用自定義的Application類就是一個非常不錯的選擇。在Application類中定義一個Object類的引用,把對象賦值給這個引用,這樣在整個進程中就能得到該對象的引用了,使用的時候向下轉型就行了。

需要注意的地方:

Application如果保存了一些不該保存的對象將導致內存泄漏,最好在使用完之後把相應的引用賦值爲空。

通常使用application分以下幾個步驟:

   1.定義一個類去繼承系統的Application

     public class MyApplication extendsApplication{

}

    在onCreat中做一些初始化工作,設置全局中要使用到的成員變量(一般都會設置對應的get和set方法)

 

  2.在AndroidManifest.xml中進行配置

      在 application節點:

      <application

        android:name="xxx.MyApplication"   //類的全路徑即完整的包名+類名

       android:icon="@drawable/ic_launcher"

       android:label="@string/app_name" >

 

3.在需要的地方直接使用(Activity、Service等)

     MyApplication  application

     application = (MyApplication)getApplication();  //將當前的上下文拆箱轉爲我們自定義的application

    這個時候我們就可以使用MyApplication中我們定義的屬性了 

   例如在service我們不斷的去定位,此時的location我們既需要最新的數據同時其它的組件要能及時獲取最新的location,我們在sevice中 application.setLastLocation(l);,通過這句話我們設置好了一個全局的location,每當location定位變化的時候,都會重新設置該值。在其它組件,我們通過application.getLastLocaton()即可獲取了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章