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 ContextWrapper
classe qui est créée autour d'un existant en Context
utilisant:
ContextWrapper wrapper = new ContextWrapper(context);
L'avantage d'utiliser un ContextWrapper
est qu'il vous permet de «modifier le comportement sans changer le contexte d'origine». Par exemple, si vous avez une activité appelée, vous myActivity
pouvez en créer un View
avec 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);
ContextWrapper
est vraiment puissant , car il vous permet de passer outre la plupart des fonctions fournies par Context
y 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()
). ContextWrapper
est 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 ContextWrapper
entoure. 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
, Activity
ou 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();
}
}
}