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 ContextWrapper
classe creata attorno a un esistente Context
utilizzando:
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, myActivity
puoi crearne una View
con 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 Context
includendo 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 ContextWrapper
avvolge. Potrebbe essere necessario accedere al contesto “base” se è necessario, ad esempio, verificare se si tratta di una 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");
}
...
}
}
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();
}
}
}