2012-02-25 14 views
20

En Android, ¿hay alguna forma de obtener el contexto de la aplicación de una manera estática? Por ejemplo, para recuperarlo de un hilo de fondo.¿Cómo obtener el contexto desde cualquier lugar?

Gracias

+1

En general, usted debe pasar una referencia a través de Contexto un argumento si llama a un método que lo necesita * (pero no almacena la referencia, puede provocar pérdidas de memoria) *. También puede usar Application-Object para esto en algunas circunstancias, vea [esta pregunta] (http://stackoverflow.com/questions/987072/using-application-context-everywhere). Pero mantenga los límites como se describe en la respuesta en mente. –

Respuesta

50

La forma más fácil (y correcta) es:

definir una nueva clase

public class MyApp extends Application { 
    private static MyApp instance; 

    public static MyApp getInstance() { 
     return instance; 
    } 

    public static Context getContext(){ 
     return instance; 
     // or return instance.getApplicationContext(); 
    } 

    @Override 
    public void onCreate() { 
     instance = this; 
     super.onCreate(); 
    } 
} 

Luego, en el manifiesto es necesario agregar esta clase para el campo "Nombre" en la pestaña "Aplicación". O editar el xml y poner

<application 
    android:name="com.example.app.MyApp" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    ....... 
    <activity 
     ...... 

y luego desde cualquier lugar se puede llamar

MyApp.getContext(); 

creo que sirve

+2

Esto funcionará, pero solo tenga cuidado al usar cualquier singleton para no abusar de él. Lea la respuesta a [esta pregunta] (http://stackoverflow.com/questions/7298731/when-to-call-activity- context-or-application-context/7298955 # 7298955) que explica por qué el ApplicationContext rara vez (aunque a veces) es el contexto adecuado para usar. Mejor manera: A menos que exponga simplemente un método público que toma un contexto como argumento dentro de sus clases que requieren contexto (y lo transfieren desde su actividad, etc.), esta es la manera de hacerlo. Exp: public void abc (Contexto c, int a); y lo llama desde cualquier actividad. –

12

Básicamente, usted tiene 2 tipos de Contexto - El contexto Actividad y la Application Context .

No es necesario utilizar un solo contexto para todo. Hay problemas si usa un Contexto en cada caso necesita Contexto. Lo mejor es seguir algo como esto: use Contexto de actividad dentro de la Actividad y Contexto de aplicación al pasar un contexto más allá del alcance de una Actividad, que le ayudará a evitar memory leaks.

Si lee este artículo, verá la diferencia entre los dos Context.

El Aplicación contexto vivirá siempre y cuando su aplicación está vivo y no depende de las actividades del ciclo de vida. Si planea mantener objetos de larga duración que necesitan un contexto, recuerde el objeto de aplicación .

En cambio, el Actividad Contexto se asocia con la actividad y podría ser destruido tantas veces como se destruye la actividad - el cambio de orientación de la pantalla, el botón Atrás etc.

+2

Esta es la buena respuesta. – ctn

Cuestiones relacionadas