Die meisten Antworten decken bereits ab getContext()und getApplicationContext()doch getBaseContext () wird selten erklärt.
Die Methode getBaseContext()ist nur relevant, wenn Sie eine haben ContextWrapper. Android bietet eine ContextWrapperKlasse, die um eine vorhandene ContextVerwendung erstellt wird:
ContextWrapper wrapper = new ContextWrapper(context);
Der Vorteil der Verwendung von a ContextWrapperbesteht darin, dass Sie das Verhalten ändern können, ohne den ursprünglichen Kontext zu ändern. Wenn Sie beispielsweise eine Aktivität namens aufgerufen haben, myActivitykönnen Sie eine Viewmit einem anderen Thema erstellen als myActivity:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapperwirklich mächtig ist , weil es Ihnen , bereitgestellt durch die meisten Funktionen können außer Kraft setzen , Contexteinschließlich Code den Zugriff auf Ressourcen (zB openFileInput(), getString()), die Interaktion mit anderen Komponenten (zB sendBroadcast(), registerReceiver()), Anfragen Berechtigungen (zB checkCallingOrSelfPermission()) und Auflösen von Dateisystem - Standorten (zB getFilesDir()). ContextWrapperist sehr nützlich, um geräte- / versionenspezifische Probleme zu umgehen oder einmalige Anpassungen auf Komponenten wie Ansichten anzuwenden, für die ein Kontext erforderlich ist.
Die Methode getBaseContext () kann verwendet werden, um auf den Basiskontext zuzugreifen, den der ContextWrapperWraps umgibt . Möglicherweise müssen Sie auf den Basiskontext zugreifen, wenn Sie beispielsweise überprüfen möchten, ob es sich um einen handelt Service, Activityoder 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");
}
...
}
}
Oder wenn Sie die "unverpackte" Version einer Methode aufrufen müssen:
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}