2010-05-07 7 views
28

Estoy trabajando en una aplicación de Android que tiene varias actividades. En él tengo una clase con varios métodos estáticos. Me gustaría poder llamar a estos métodos desde las diferentes actividades. Estoy usando los métodos estáticos para cargar datos de un archivo xml a través de XmlResourceParser. Para crear un XmlResourceParser se requiere una llamada en el contexto de la aplicación. Entonces mi pregunta es, ¿cuál es la mejor manera de obtener una referencia al contexto de la aplicación en los métodos estáticos? Haga que cada actividad lo obtenga y lo pase? Almacenar de alguna manera en una variable global?La mejor manera de obtener un contexto de aplicación en un método estático en Android

+0

Posible duplicado de [forma estática para obtener 'Contexto' en Android?] (Http://stackoverflow.com/questions/2002288/static-way-to-get-context-on-android) –

Respuesta

21

La mejor manera sería pasar el objeto Activity como parámetro a las funciones estáticas.

AFAIK, no hay tal método que le proporcione el contexto de la aplicación en el método estático.

4

No estoy seguro de que esto va a funcionar todo el tiempo, pero funciona para mí ahora:

public class myActivity extends ListActivity 
{ 
    public static Context baseContext; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     baseContext = getBaseContext(); 
    } 

entonces puede usar la estática en el paquete:

myApplication.baseContext 
+5

Sólo se listo para encontrar el contexto base nulo de contextos estáticos que se ejecutan antes de llamar al método OnCreate no estático. –

+10

Este enfoque creará pérdidas de memoria en su código. ¡No hagas eso! – jpardogo

+0

@jpardogo pérdidas de memoria múltiples ?? ¿cómo? – gjpc

2

Hay un puesto en el blog Sane Tricks For InsaneWorld con una respuesta. Dice que puede reemplazar el objeto Aplicación con su propia subclase y luego mantener el contexto de la aplicación estáticamente allí. Puede encontrar un código de ejemplo en la publicación.

La entrada del blog original, - http://uquery.blogspot.co.il/2011/08/how-to-get-application-context.html

+1

a partir de Android Studio 2.2.2, este enfoque genera una advertencia: "No coloque las clases de contexto de Android en campos estáticos, esto es una pérdida de memoria (y también rompe la ejecución instantánea). Un campo estático va a filtrar los contextos". – WilliamK

+1

@WilliamK hay una excepción a esta regla con el contexto de la aplicación. Vive mientras su aplicación viva para que no se filtre. Sin embargo, ¡no pongas un contexto de actividad en un campo estático! – JensV

2

Esto debe recibir acceso a applicationContext desde cualquier lugar que le permite obtener applicationContext en cualquier lugar que pueda usarlo; Toast, getString(), sharedPreferences, etc. Lo he usado para obtener applicationContext dentro de métodos estáticos varias veces.

El Singleton:

package com.domain.packagename; 

import android.content.Context; 

/** 
* Created by Versa on 10.09.15. 
*/ 
public class ApplicationContextSingleton { 
    private static PrefsContextSingleton mInstance; 
    private Context context; 

    public static ApplicationContextSingleton getInstance() { 
     if (mInstance == null) mInstance = getSync(); 
     return mInstance; 
    } 

    private static synchronized ApplicationContextSingleton getSync() { 
     if (mInstance == null) mInstance = new PrefsContextSingleton(); 
     return mInstance; 
    } 

    public void initialize(Context context) { 
     this.context = context; 
    } 

    public Context getApplicationContext() { 
     return context; 
    } 

} 

Inicializar el Singleton en su Application subclase:

package com.domain.packagename; 

import android.app.Application; 

/** 
* Created by Versa on 25.08.15. 
*/ 
public class mApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     ApplicationContextSingleton.getInstance().initialize(this); 
    } 
} 

Si no estoy equivocado, esto le da un gancho para applicationContext en todas partes, lo llaman con ApplicationContextSingleton.getInstance.getApplicationContext(); No debería necesitar aclarar esto en ningún momento, ya que cuando se cierra la aplicación, esto conlleva de todos modos.

Recuerde actualizar AndroidManifest.xml utilizar este Application subclase:

<?xml version="1.0" encoding="utf-8"?> 

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.domain.packagename" 
    > 

<application 
    android:allowBackup="true" 
    android:name=".mApplication" <!-- This is the important line --> 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:icon="@drawable/app_icon" 
    > 

Por favor, hágamelo saber si usted ve algo mal aquí, gracias. :)

+0

No sé si esta es la mejor manera de hacerlo. Pero creo que la inicialización de singletons que necesitan un contexto en la entrada de 'Application' es una buena idea. Si no, debo pasar un 'Contexto' a' SingletonClass.getInstance (Context) 'cada vez que lo llamo y es realmente molesto. – ProtossShuttle

+0

Sí, es un poco molesto, he estado usando clases como estas [gPrefs] (https://gist.github.com/kai-kb/0393e6239db3b90a771c) [gString] (https: //gist.github .com/kai-kb/3da8389513c21a671dbe) para combatir eso hasta cierto punto. – Versa

+0

Este enfoque también genera una advertencia sobre problemas de fuga y ejecución instantánea: "No coloque clases de contexto de Android en campos estáticos (referencia estática a ApplicationContextSingleton que tiene contexto de campo apuntando al contexto); esto es una pérdida de memoria (y también se rompe) Ejecutar). Un campo estático perderá contextos. – WilliamK

Cuestiones relacionadas