2013-05-17 3 views
3

Документация для Android для приложений: Как правило, нет необходимости в подклассе Application. В большинстве ситуаций статические синглтоны могут обеспечивать ту же функциональность (т. поддерживать глобальное состояние приложения] более модульным образом. Если вашему singleton нужен глобальный контекст (например, для регистрации широковещательных приемников), функции для его получения может быть предоставлен контекст, который внутренне использует Context.getApplicationContext() при первом построении синглета.Android: поддержание глобального состояния приложения

Моя просьба: можете ли вы объяснить и предоставить образец кода, который реализует приведенное выше предложение по поддержанию глобального состояния.

Обратите внимание, что уже существует предположение, что рекомендует подклассов Применение: How to declare global variables in Android?

Спасибо.

ответ

5

Если я не ошибаюсь, вы пытаетесь сохранить глобальные переменные без расширения приложения. Если так что вы можете сделать две вещи

, если вам не нужен какой-либо контекст, то вы ча просто использовать класс со статическими членами, как этот

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

Поскольку Райан Томас указал, что правильно использовать Context.getApplicationContext() вместо переданного контекста. – Octavian

+0

Как более безопасная сторона для предложения 1: вы можете пометить его как частный конструктор, чтобы он не мог его создать. –

6

Исправление к ап StinePike в swer относительно контекста в ApplicationState. В отправленном коде контекст, переданный в состояние приложения, сохраняется. Если контекст передается в виде активности или аналогичной единицы, тогда активность будет утечка и предотвращение сбора мусора.

Андроид 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() ':« Если он используется из контекста, возвращаемого здесь, приемник регистрируется с глобальным состоянием, связанным с вашим приложением. никогда не будет незарегистрирован для вас. Это необходимо, если получатель связан со статическими данными, а не с конкретным компонентом. Однако использование ApplicationContext в другом месте может легко привести к серьезным утечкам, если вы забудете отменить регистрацию, отменить и т. д. –

+1

@AntonioSesto API-документ относится к двум ситуациям. В первой ситуации это относится к использованию объекта контекста, такого как активность, непосредственно для регистрации приемника, такого как 'activity.registerReceiver (...)', и указывая, что приемник, как ожидается, будет незарегистрирован до того, совершенное уничтожение. Он также указывает, что если вы не сможете отменить регистрацию получателя, инфраструктура сделает это АВТОМАТИЧЕСКИ и, таким образом, предотвратит утечку зарегистрированного приемника и ссылок. –

+1

@AntonioSesto Во второй ситуации, которую вы цитируете в документе API, ссылается на использование контекста приложения, такого как 'activity.getApplicationContext(). RegisterReceiver (...) ', и в этом случае у вас будет доступ к статическим данным в« глобальном состоянии »приложения, но зарегистрированный получатель не будет автоматически очищен в любой точке, что означает, что разработчик должен убедиться, что они случайно не создают ситуацию в котором зарегистрированному приемнику или подобным объектам разрешено создавать утечки. –