Android Singleton con un contexto global

Según la documentación de Android, afirma:

Normalmente no es necesario subclasificar la Aplicación. En la mayoría de las situaciones, los singletons estáticos pueden proporcionar la misma funcionalidad de una manera más modular. Si su singleton necesita un contexto global (por ejemplo, para registrar receptores de radiodifusión), la función para recuperarla se puede dar un contexto que utiliza internamente Context.getApplicationContext() al construir primero el singleton.

¿Cómo hago para crear un singleton estático que tiene un contexto global para que sobreviva a la actividad en ejecución que está cambiando en mi aplicación? ¿Es suficiente tener un contexto estático que hace referencia a la getApplicationContext ()?

Editado / mejorado respuesta:

Porque esta respuesta es cada vez más popular, voy a mejorar mi propia respuesta con código de ejemplo de lo que he estado utilizando últimamente (a partir de julio / 2014).

Comience por tener la aplicación manteniendo una referencia a sí mismo.

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

Entonces en cualquier singleton que necesita acceso al context I perezoso cargar los singles de una manera segura de la rosca usando la sincronización de la revisión doble como explicado aquí 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(); } 

Respuesta original

Lo que la documentación sugiere es usar un patrón singleton normal

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

E incluir en su interior un método como este:

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

Y recuerde llamar esto para inicializar el singleton.

La diferencia entre el enfoque de aplicación y el enfoque Singleton y por qué el singleton es mejor está en la same functionality in a more modular way la documentación same functionality in a more modular way

Tengo tal clase en mi aplicación:

 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; } } 

Y luego, por ejemplo, en Launch Activity, iníciela:

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

Puede crear una clase Application local, que está diseñada para ser exactamente lo que está buscando (un singleton con ámbito global).

La sintaxis para esto es:

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

Esta es la forma admitida para hacer esto, y la ruta correcta. Creo que puede estar mal leer esa declaración de documentación en particular.

A continuación, puede hacer referencia a ella desde su actividad con la siguiente sintaxis:

 MyApplication myapp = (MyApplication) getApplicationContext(); 
  • Ciclo de vida de singleton basado en enum en Android
  • ¿Qué hace este método privado en esta clase singleton Java?
  • Singletons vs. Contexto de la aplicación en Android?
  • Acceso al objeto GoogleApiClient en Todas las actividades
  • Configuración del valor de propiedad Singleton en el Listado de Firebase
  • Obtenga el contexto de aplicación de la clase singleton de no actividad
  • Acceder a los campos singleton mediante un método estático
  • Usando Gson para deserializar a Json en un singleton
  • ¿Es una práctica aceptable usar Objetos Singleton para guardar el estado o compartir datos entre Actividades?
  • Una instancia de MediaPlayer de Android: singleton
  • Obtener contexto en la biblioteca de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.