2012-07-15 10 views
13

¿Puedo confiar en la declaración de que la aplicación Context no está cambiando durante el ciclo de vida de la aplicación? ¿Qué ocurre si guardo un context en algún lugar usando un patrón de singleton y luego lo uso donde sea que lo necesite?¿Se puede cambiar el contexto de la aplicación durante el ciclo de vida de la aplicación?

+0

Probablemente esto podría ser útil: http://stackoverflow.com/questions/708012/android-how-to-declare- global-variables/4642069 # 4642069 –

+1

¿Por qué necesita almacenar el contexto? Siempre puede obtenerlo llamando a getApplicationContext() – Yury

+0

@Yury: no desde una clase de No actividad o Aplicación. –

Respuesta

14

para responder a su segunda pregunta: Si necesita almacenar un estado en un conjunto unitario, a continuación, puede utilizar la clase Android Application y su Application se convierte en su Singleton (que también es un Context). No habría necesidad de almacenarlo.

A la primera pregunta, sobre si la Context se puede cambiar en tiempo de ejecución: tipo de relación con your other question, creo que podemos imaginar eso examinado ContextWrapper.attachBaseContext:

protected void attachBaseContext(Context base) { 
    if (mBase != null) { 
     throw new IllegalStateException("Base context already set"); 
    } 
    mBase = base; 
} 

Así que, sí, puede confiar en eso; no se puede cambiar, y si lo intentas, lanzará un IllegalStateException.

+0

¿Qué pasaría si la aplicación fuera eliminada por alguna razón? – Eugene

+0

Si se mata la aplicación, no puedes hacer nada al respecto porque también has sido asesinado. ¿Necesita persistir la información en la aplicación detenida y reiniciada? Desearía usar Preferencias Compartidas para eso. –

0

En la clase de aplicación se encuentra una clase de nivel de aplicación singletion para aplicaciones de Android. Mi respuesta es no, no puedes cambiar el objeto de contexto de la aplicación.

1

Existe cierta controversia sobre este tema. Incluso algunos entre personas de Google. Guardo el que creo que es el enfoque correcto que básicamente trata de obtener el contexto de actividad tantas veces como sea posible. Por lo que respecta a la razón, el objetivo del contexto es proporcionar algunos recursos/partes de su aplicación al entorno desde el que está funcionando. Cuanto más precisa es la información que le da al sistema, menos inesperado sería el comportamiento (es decir: solo tiene acceso a algunos recursos dentro del ámbito de contexto de la actividad y el camino del contexto de la aplicación.

Recuerde que la actividad es un contexto, por lo que pasar "esto" hará el trabajo si está dentro de una actividad, o "getActivity()" si su código funciona desde dentro de un fragmento.

Además, tengo que estar de acuerdo con devmiles Es bastante útil utilizar su propia clase de aplicación como Singleton, ya que puede administrar fácilmente el ciclo de vida de la aplicación y usarla como un punto medio adecuado. Una vez más, para obtener el contexto de la aplicación es suficiente llamar a getApplicationContext o incluso la instancia de su clase Singleton de aplicación.

1

Sí, puede confiar en que el contexto no se cambia durante el ciclo de vida de la aplicación.

Google dígalo en el resumen de la clase Application.

Creo que será perfecto para su caso.

1

La aplicación es un singleton y no sé de una manera de eludir eso sin cambiar el núcleo.

Sin embargo, existe la posibilidad de encontrar 2 instancias de un objeto Aplicación si su código inicia otro proceso. Un ejemplo sería comenzar un servicio remoto; esto creará otro proceso que creará su propia instancia del objeto de la aplicación.

http://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSample

Para evitar confusiones debe comunicarse entre el servicio remoto y el resto de la aplicación utilizando una de las opciones androide parcelable o Serializable:

Mensaje - Handler Bundle Intención Intención putExtra

o cree uno propio

Cuestiones relacionadas