Android Singleton с глобальным контекстом

В Android-документации говорится:

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

Как мне создать статический синглтон, имеющий глобальный контекст, чтобы он выжил при изменении текущей активности в моем приложении? Достаточно ли иметь статический контекст, который ссылается на getApplicationContext ()?

Solutions Collecting From Web of "Android Singleton с глобальным контекстом"

Отредактированный / улучшенный ответ:

Потому что этот ответ становится популярным, я улучшу свой собственный ответ с примером кода того, что я использовал в последнее время (по состоянию на июль / 2014 год).

Начните с того, что приложение сохраняет ссылку на себя.

 public class App extends Application { private static App instance; public static App get() { return instance; } @Override public void onCreate() { super.onCreate(); instance = this; } } 

То на любом одноэлементном узле, который нуждается в доступе к context я лениво загружаю синглы в безопасном потоке, используя двойную проверку синхронизации, как описано здесь. https://stackoverflow.com/a/11165926/906362

 private static SingletonDemo instance; public static SingletonDemo get() { if(instance == null) instance = getSync(); return instance; } private static synchronized SingletonDemo getSync() { if(instance == null) instance = new SingletonDemo(); return instance; } private SingletonDemo(){ // here you can directly access the Application context calling App.get(); } 

Оригинальный ответ:

Что предлагает документация, – использовать обычный одноэлементный шаблон

  public class SingletonDemo { private static SingletonDemo instance = null; private SingletonDemo() { } public static SingletonDemo getInstance() { if (instance == null) { instance = new SingletonDemo (); } return instance; } } 

И включить внутри него метод, подобный этому:

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

И не забудьте вызвать это, чтобы инициализировать синглтон.

Разница между Прикладным подходом и подходом Singleton и тем, почему Синглтон лучше, заключается в том, что документация обладает такими same functionality in a more modular way

У меня такой класс в моем приложении:

 public class ApplicationContext { private Context appContext; private ApplicationContext(){} public void init(Context context){ if(appContext == null){ appContext = context; } } private Context getContext(){ return appContext; } public static Context get(){ return getInstance().getContext(); } private static ApplicationContext instance; public static ApplicationContext getInstance(){ return instance == null ? (instance = new ApplicationContext()): instance; } } 

А затем, например, в Launch Activity инициализируйте его:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //init ApplicationContext.getInstance().init(getApplicationContext()); //use via ApplicationContext.get() assert(getApplicationContext() == ApplicationContext.get()); } 

Вы можете создать локальный класс Application, который предназначен именно для того, что вы ищете (singleton with Global scope).

Синтаксис для этого:

 public class MyApplication extends Application { // Create your globally scoped variables and methods in here } 

Это поддерживаемый способ сделать это и правильный путь. Я думаю, вы можете неправильно прочитать эту конкретную инструкцию по документации.

Затем вы можете ссылаться на нее из своего действия со следующим синтаксисом:

 MyApplication myapp = (MyApplication) getApplicationContext();