variable usar studio publicas globales for declarar crear all activities android process static android-context

usar - ¿Es seguro guardar el contexto de la aplicación en una variable estática en Android?



usar variables globales en android (4)

¿es seguro guardar el contexto de la aplicación en una variable estática?

En este momento, sí, parece estar seguro, aunque no tendría getAppContext() return Context , pero en su lugar devuelve App o Application .

Una vez dicho esto, el hecho de que el equipo central de Android no lo haya configurado de esta manera en primer lugar sugiere que tal vez haya problemas ocultos de los que no tenemos conocimiento, o que en el futuro este enfoque pueda presentar problemas.

Como dice el acrónimo del refrán, YMMV . :-)

EDITAR

si es así, ¿también es seguro para cualquier otra clase tener algún tipo de referencia para el contexto de la aplicación?

No tengo idea de lo que quieres decir con "seguro" aquí.

pero si uso múltiples procesos, obtendré referencias totalmente diferentes a la clase de la aplicación en cada proceso, ¿verdad?

Si usa procesos múltiples, se le debe abofetear con una trucha. Pero, sí, debe obtener instancias de App distintas por proceso.

Sé que el uso de variables estáticas en Android es bastante arriesgado, especialmente si los referencia a actividades. Sin embargo, si tengo una clase que extienda la Aplicación (llamemos a esta clase "Aplicación"), ¿es seguro hacer referencia a la instancia de esta clase?

Si es así, ¿también es seguro para cualquier otra clase tener algún tipo de referencia al contexto de la aplicación? Quiero decir, ¿puede haber una pérdida de memoria si tengo una referencia al contexto de la aplicación en cualquier clase de clase?

El objetivo es que no importa en qué alcance me encuentre, siempre puedo obtener una referencia al contexto de la aplicación. Creo que es seguro, ya que si el sistema cierra la aplicación, la variable estática también se va hasta la próxima vez que la aplicación se inicia nuevamente, lo que inicializará la variable estática nuevamente.

Además, no es que importe demasiado, pero si utilizo procesos múltiples, ¿obtendré referencias totalmente diferentes a la clase de la aplicación en cada proceso?

Como ejemplo de código, esto es lo que estoy pensando:

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


Debería ser seguro. Además, la siguiente nota de los developer.android.com/reference/android/app/Application.html podría ser relevante para usted:

Normalmente no hay necesidad de subclasificar la Application . En la mayoría de las situaciones, los singleton 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 difusión), la función para recuperarlo puede tener un Contexto que internamente utiliza Context.getApplicationContext() cuando construye el singleton por primera vez.


Es seguro hacerlo en Application#onCreate() porque la Application se crea antes de cualquier actividad. Si se mata tu aplicación en segundo plano, la instancia de la Application volverá a crear y tu global se establecerá antes de que se ejecute cualquier actividad.

Es importante tener en cuenta que nunca debe establecer variables globales de una actividad. Si lo haces, tu aplicación podría fallar de la siguiente manera:

  1. Establecer global en la actividad A
  2. Navega a la actividad B
  3. La aplicación entra en el fondo
  4. Marco mata la aplicación y el proceso
  5. La aplicación está restaurada
  6. El framework crea la actividad B. Las actividades en la backstack no se crean hasta que vuelves a ellas, ¡entonces no se establece global!
  7. La actividad B intenta usar global, y boom ... NullPointerException

Un comentario interesante surgió de Studio cuando estaba ordenando contextos estáticos desagradables:

"Esto es una fuga (y también rompe la ejecución instantánea)".

Entonces, con el lanzamiento de Instant Run, tenemos el caso donde los desarrolladores de Android no planean guardar variables estáticas. Aunque la ejecución instantánea no está (todavía) en mi agenda, es útil saber que hay un ejemplo específico donde no solo se trata de una mala práctica, sino que también se identifica el caso de uso en el que está equivocado.