La majorité des applications qui souhaitent une méthode pratique pour obtenir le contexte d'application créent leur propre classe qui s'étend android.app.Application
.
GUIDER
Vous pouvez accomplir cela en créant d'abord une classe dans votre projet comme suit:
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;
}
}
Ensuite, dans votre AndroidManifest, vous devez spécifier le nom de votre classe dans la balise AndroidManifest.xml:
<application
...
android:name="com.example.App" >
...
</application>
Vous pouvez ensuite récupérer le contexte d'application dans n'importe quelle méthode statique à l'aide de ce qui suit:
public static void someMethod() {
Context context = App.getContext();
}
ATTENTION
Avant d'ajouter quelque chose comme ce qui précède à votre projet, vous devez considérer ce que dit la documentation:
Il n'est normalement pas nécessaire de sous-classer Application. Dans la plupart des situations, les singletons statiques peuvent fournir les mêmes fonctionnalités de manière plus modulaire. Si votre singleton a besoin d'un contexte global (par exemple pour enregistrer des récepteurs de diffusion), la fonction pour le récupérer peut recevoir un contexte qui utilise en interne Context.getApplicationContext () lors de la première construction du singleton.
RÉFLEXION
Il existe également une autre façon d'obtenir le contexte de l'application à l'aide de la réflexion. La réflexion est souvent méprisée dans Android et je pense personnellement que cela ne devrait pas être utilisé en production.
Pour récupérer le contexte de l'application, nous devons appeler une méthode sur une classe cachée ( ActivityThread ) qui est disponible depuis l'API 1:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.ActivityThread")
.getMethod("currentApplication").invoke(null, (Object[]) null);
}
Il existe une autre classe cachée ( AppGlobals ) qui fournit un moyen d'obtenir le contexte d'application de manière statique. Il obtient le contexte en utilisant ActivityThread
donc il n'y a vraiment aucune différence entre la méthode suivante et celle publiée ci-dessus:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.AppGlobals")
.getMethod("getInitialApplication").invoke(null, (Object[]) null);
}
Bon codage!