Większość odpowiedzi już pokryć getContext()
i getApplicationContext()
ale getBaseContext () jest rzadko wyjaśnione.
Ta metoda getBaseContext()
jest ważna tylko wtedy, gdy masz ContextWrapper
. Android zapewnia ContextWrapper
klasę utworzoną wokół istniejącej Context
za pomocą:
ContextWrapper wrapper = new ContextWrapper(context);
Zaletą używania a ContextWrapper
jest to, że pozwala „modyfikować zachowanie bez zmiany oryginalnego kontekstu”. Na przykład, jeśli masz aktywność o nazwie, myActivity
możesz utworzyć View
z innym motywem niż myActivity
:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
jest naprawdę potężny, ponieważ pozwala zastąpić większość funkcji oferowanych przez Context
tym kod dostępu do zasobów (np openFileInput()
, getString()
), interakcje z innymi składnikami (np sendBroadcast()
, registerReceiver()
), żądania uprawnienia (np checkCallingOrSelfPermission()
) i lokalizacje rozwiązywania systemie plików (np getFilesDir()
). ContextWrapper
jest naprawdę przydatny do obejścia problemów specyficznych dla urządzenia / wersji lub zastosowania jednorazowych dostosowań do komponentów takich jak Widoki, które wymagają kontekstu.
Metodę getBaseContext () można wykorzystać do uzyskania dostępu do „podstawowego” kontekstu, który jest ContextWrapper
zawijany. Konieczne może być uzyskanie dostępu do kontekstu „podstawowego”, jeśli chcesz na przykład sprawdzić, czy jest to Service
, Activity
czy 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");
}
...
}
}
Lub jeśli chcesz wywołać „nieopakowaną” wersję metody:
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}