La plupart des réponses couvrent déjà getContext()et getApplicationContext()mais getBaseContext () est rarement expliqué.
La méthode getBaseContext()n'est pertinente que si vous en avez un ContextWrapper. Android fournit une ContextWrapperclasse qui est créée autour d'un existant en Contextutilisant:
ContextWrapper wrapper = new ContextWrapper(context);
L'avantage d'utiliser un ContextWrapperest qu'il vous permet de «modifier le comportement sans changer le contexte d'origine». Par exemple, si vous avez une activité appelée, vous myActivitypouvez en créer un Viewavec un thème différent de celui-ci myActivity:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapperest vraiment puissant , car il vous permet de passer outre la plupart des fonctions fournies par Contexty compris le code d'accès aux ressources (par exemple openFileInput(), getString()), interagir avec d' autres composants (par exemple sendBroadcast(), registerReceiver()), les autorisations des demandes (par exemple checkCallingOrSelfPermission()) et la résolution des emplacements du système de fichiers (par exemple getFilesDir()). ContextWrapperest très utile pour contourner les problèmes spécifiques à l'appareil / à la version ou pour appliquer des personnalisations ponctuelles à des composants tels que des vues qui nécessitent un contexte.
La méthode getBaseContext () peut être utilisée pour accéder au contexte «de base» qui ContextWrapperentoure. Si vous avez besoin, par exemple, vérifier si elle est un que vous pourriez avoir besoin d'accéder au contexte « de base » Service, Activityou Application:
public class CustomToast {
public void makeText(Context context, int resId, int duration) {
while (context instanceof ContextWrapper) {
context = context.baseContext();
}
if (context instanceof Service)) {
throw new RuntimeException("Cannot call this from a service");
}
...
}
}
Ou si vous devez appeler la version «déballée» d'une méthode:
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}