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 ContextWrapperklasę utworzoną wokół istniejącej Contextza pomocą:
ContextWrapper wrapper = new ContextWrapper(context);
Zaletą używania a ContextWrapperjest to, że pozwala „modyfikować zachowanie bez zmiany oryginalnego kontekstu”. Na przykład, jeśli masz aktywność o nazwie, myActivitymożesz utworzyć Viewz innym motywem niż myActivity:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapperjest naprawdę potężny, ponieważ pozwala zastąpić większość funkcji oferowanych przez Contexttym 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()). ContextWrapperjest 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 ContextWrapperzawijany. Konieczne może być uzyskanie dostępu do kontekstu „podstawowego”, jeśli chcesz na przykład sprawdzić, czy jest to Service, Activityczy 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();
}
}
}