Die meisten Antworten decken bereits getContext()
y getApplicationContext()
sondern getBaseContext() wird selten erklärt.
Die Methode getBaseContext()
ist nur relevant, wenn Sie eine ContextWrapper
. Android bietet eine ContextWrapper
Klasse, die um eine bestehende Context
verwenden:
ContextWrapper wrapper = new ContextWrapper(context);
Der Vorteil der Verwendung eines ContextWrapper
ist, dass man damit "das Verhalten ändern kann, ohne den ursprünglichen Kontext zu verändern". Wenn Sie zum Beispiel eine Aktivität namens myActivity
kann dann eine View
mit einem anderen Thema als myActivity
:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
ist sehr leistungsfähig, weil es Ihnen erlaubt, die meisten Funktionen, die von Context
einschließlich Code für den Zugriff auf Ressourcen (z. B. openFileInput()
, getString()
), interagieren mit anderen Komponenten (z. B. sendBroadcast()
, registerReceiver()
), beantragt Genehmigungen (z. B. checkCallingOrSelfPermission()
) und das Auflösen von Dateisystempositionen (z.B. getFilesDir()
). ContextWrapper
ist sehr nützlich, um geräte-/versionsspezifische Probleme zu umgehen oder um einmalige Anpassungen an Komponenten wie Views vorzunehmen, die einen Kontext erfordern.
Die Methode getBaseContext() kann verwendet werden, um auf den "Basis"-Kontext zuzugreifen, den die ContextWrapper
wickelt um. Möglicherweise müssen Sie auf den "Basis"-Kontext zugreifen, wenn Sie z. B. prüfen wollen, ob es sich um einen Service
, Activity
o 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();
}
}
}