2013-05-17 39 views
3

適用於應用程序狀態的Android文檔: 通常不需要繼承應用程序。在大多數情況下,靜態單例可以提供相同的功能[即以更模塊化的方式維護全局應用程序狀態。如果你的單例需要一個全局上下文(例如註冊廣播接收者),那麼檢索它的函數可以被賦予一個上下文,該上下文在第一次構造單例時在內部使用Context.getApplicationContext()。Android:維護全球應用程序狀態

我的要求是:你能解釋一下,並提供實現上述維護全局狀態的建議的代碼示例。

注意,已經有該建議的子類應用建議: How to declare global variables in Android?

謝謝。

回答

5

如果我沒有錯,你正試圖保存全局變量而不擴展應用程序。如果是這樣,你可以做兩件事

,如果你不需要任何情況下,你只需CA與使用靜態成員一類這樣的

public class ApplicationState { 
    public static boolean get() { 
     return b; 
    } 

    public static void set(boolean a) { 
     b = a; 
    } 

    private static boolean b; 
} 

如果你需要一個背景,但你不希望擴展應用程序,你可以使用

Public class ApplicationState { 
    private Context context; 
    private static ApplicationState instance; 

    private ApplicationState(Context context) { 
     this.context = context; 


    public static ApplicationState getInstance(Context context) { 
     if (instance == null) { 
      instance = new ApplicationState(context); 
     } 
     return instance; 
    } 

    public void someMethod(){} 
} 

所以你可以這樣調用 ApplicationState.getInstance(context).somemethod();

+0

正如Ryan Thomas指出,使用Context.getApplicationContext()而不是傳遞的上下文是正確的。 – Octavian

+0

作爲建議1的一個更安全的一面:你可以將它標記爲私有構造函數,所以不能實例化它。 –

6

修正一些方法來StinePike的一個關於ApplicationState中的上下文轉向。在傳遞到應用程序狀態的上下文中的代碼被保存到。如果傳入的上下文是一個活動或類似的單位,那麼該活動將被泄漏並且被阻止被垃圾收集。

Application類的android documentation聲明您應該「在內部使用Context.getApplicationContext()首次構造單例時」。

public class ApplicationState { 
    private Context applicationContext; 
    private static ApplicationState instance; 

    private ApplicationState(Context context) { 
     this.applicationContext = context.getApplicationContext(); 
    } 

    public static ApplicationState getInstance(Context context) { 
     if(instance == null) { 
      instance = new ApplicationState(context); 
     } 
     return instance; 
    } 
} 
+0

您可以簡單介紹一下他們在API中爲Context.getApplicationContext()所說的內容:「如果從這裏返回的Context中使用,接收者正在註冊與您的應用程序相關的全局狀態,因此它如果接收者與靜態數據相關聯,而不是特定的組件,這是必須的,但如果忘記取消註冊,取消綁定等操作,在其他地方使用ApplicationContext很容易導致嚴重的泄漏。 –

+1

@AntonioSesto API文檔指的是兩種情況。 在第一種情況下,它指的是直接使用諸如活動之類的上下文對象來註冊諸如「activity.registerReceiver(...)」之類的接收者,並指出在活動之前預期接收者未註冊被毀壞了。它還指出,如果您未能註銷接收器,框架將自動執行此操作,從而防止註冊的接收器和引用泄漏。 –

+1

@AntonioSesto在第二種情況下,您引用API文檔的引用了使用應用程序上下文,如'activity.getApplicationContext()。registerReceiver(...)'在這種情況下,您將可以訪問應用程序「全局狀態」中的靜態數據,但註冊的接收器不會在任何時候自動清除,這意味着由開發人員確保它們不會意外創建情況其中登記的接收人或類似物體被允許造成泄漏。 –