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 ContextWrapper
Klasse, die um eine vorhandene Context
Verwendung erstellt wird:
ContextWrapper wrapper = new ContextWrapper(context);
Der Vorteil der Verwendung von a ContextWrapper
besteht darin, dass Sie das Verhalten ändern können, ohne den ursprünglichen Kontext zu ändern. Wenn Sie beispielsweise eine Aktivität namens aufgerufen haben, myActivity
können Sie eine View
mit einem anderen Thema erstellen als myActivity
:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
wirklich mächtig ist , weil es Ihnen , bereitgestellt durch die meisten Funktionen können außer Kraft setzen , Context
einschließ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()
). ContextWrapper
ist 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 ContextWrapper
Wraps umgibt . Möglicherweise müssen Sie auf den Basiskontext zugreifen, wenn Sie beispielsweise überprüfen möchten, ob es sich um einen handelt Service
, Activity
oder 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();
}
}
}