2011年4月16日 星期六

Android application 中 global 的 data 的處理

開發 Android applications 時我該如何儲存 global 的 data ? 使用平常在開發 Java 時的 singleton pattern 好嗎? 我的 activity 須要跟背景的 service 要資料來更新 UI , 該怎麼作?


以上是一些 Java programmer 在 android 平台上必定會碰到的問題
總的來說, 就是如何得到一塊可以跨 activity 或 activity 與 service 的儲存空間 or 對像

以下簡短總結關於上述問題的結論

  1. 使用平常在開發 Java 時的 singleton pattern 好嗎?


    ans: 
    對於平常可能已經養成使用一些進階技巧但是剛踏入 Android 平台的 Java developer 來說 , 直覺想到的就是 apply singleton pattern (對象可能是某activity內的類別 or 跟service有關的類別) , 然而由於 Android application 是架構(運行)在 framework 之上的 不幸的是, 若當前 android system 察覺系統記憶體吃緊時, 會遵循特定的 policy 去砍掉某個非前景的 activity (甚至是service[1]) 以釋放記憶體 , 這時很可能你的 singleton object 就會不復存在

  2. 解決之道為何?

    ans:
    我們可以透過繼承 android.app.Application 這個 class , 並且將global data都存在這個class中 , 該class的instance會長久依附在你的 application中, 只要你的 application 沒有被 kill (只要service還在, 這些data就還在 ) , 因此對於那些需要藉由 background service 提供 data 以供 UI activity 的程式來說 , 相當好用

    以下是實際的操作範例:
    將 menifest 作修改如下 , ApplicationEx 為繼承 
    android.app.Application 的class
    存取該
    ApplicationEx instance的方法為 : 在 service or activity中呼叫  getApplicationContext 並將其 return value 轉型至你要的型態即可

    <application 
    
    android:icon="@drawable/app_icon"
    android:label="@string/app_name"
    android:name="com.mycompany.myapp.ApplicationEx">
    </application>

     [1] 可以將
    service 設定為 foreground service 避免被砍掉

沒有留言:

張貼留言