La mayoría de las aplicaciones que desean un método conveniente para obtener el contexto de la aplicación crean su propia clase que se extiende android.app.Application
.
GUÍA
Puede lograr esto creando primero una clase en su proyecto como la siguiente:
import android.app.Application;
import android.content.Context;
public class App extends Application {
private static Application sApplication;
public static Application getApplication() {
return sApplication;
}
public static Context getContext() {
return getApplication().getApplicationContext();
}
@Override
public void onCreate() {
super.onCreate();
sApplication = this;
}
}
Luego, en su AndroidManifest, debe especificar el nombre de su clase en la etiqueta de AndroidManifest.xml:
<application
...
android:name="com.example.App" >
...
</application>
Luego puede recuperar el contexto de la aplicación en cualquier método estático utilizando lo siguiente:
public static void someMethod() {
Context context = App.getContext();
}
ADVERTENCIA
Antes de agregar algo como lo anterior a su proyecto, debe considerar lo que dice la documentación:
Normalmente no hay necesidad de subclase 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 difusión), la función para recuperarlo puede recibir un Context que internamente usa Context.getApplicationContext () cuando construye el singleton por primera vez.
REFLEXIÓN
También hay otra forma de obtener el contexto de la aplicación utilizando la reflexión. La reflexión a menudo es menospreciada en Android y personalmente creo que esto no debería usarse en la producción.
Para recuperar el contexto de la aplicación, debemos invocar un método en una clase oculta ( ActivityThread ) que ha estado disponible desde la API 1:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.ActivityThread")
.getMethod("currentApplication").invoke(null, (Object[]) null);
}
Hay una clase oculta más ( AppGlobals ) que proporciona una forma de obtener el contexto de la aplicación de forma estática. Obtiene el contexto utilizando, ActivityThread
por lo que realmente no hay diferencia entre el siguiente método y el publicado anteriormente:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.AppGlobals")
.getMethod("getInitialApplication").invoke(null, (Object[]) null);
}
¡Feliz codificación!