La maggior parte delle risposte copre già getContext()e getApplicationContext()ma getBaseContext () viene raramente spiegato.
Il metodo getBaseContext()è rilevante solo quando hai un ContextWrapper. Android fornisce una ContextWrapperclasse creata attorno a un esistente Contextutilizzando:
ContextWrapper wrapper = new ContextWrapper(context);
Il vantaggio dell'uso di a ContextWrapperè che ti permette di "modificare il comportamento senza cambiare il contesto originale". Ad esempio, se hai un'attività chiamata, myActivitypuoi crearne una Viewcon un tema diverso da myActivity:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapperè davvero potente perché consente di ignorare la maggior parte delle funzioni fornite Contextincludendo il codice per accedere alle risorse (ad es openFileInput(). getString()), interagire con altri componenti (ad es sendBroadcast(). registerReceiver()), richiedere autorizzazioni (ad es. checkCallingOrSelfPermission()) e risolvere i percorsi dei file system (ad es getFilesDir().). ContextWrapperè davvero utile per aggirare i problemi specifici di dispositivo / versione o applicare personalizzazioni una tantum a componenti come Viste che richiedono un contesto.
Il metodo getBaseContext () può essere utilizzato per accedere al contesto "base" che ContextWrapperavvolge. Potrebbe essere necessario accedere al contesto “base” se è necessario, ad esempio, verificare se si tratta di una Service, Activityo 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");
}
...
}
}
O se è necessario chiamare la versione "non scartata" di un metodo:
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}