mayoría de las respuestas ya cubren getContext()
y getApplicationContext()
pero getBaseContext() rara vez se explica.
El método getBaseContext()
solo es relevante cuando tiene un ContextWrapper
. Android proporciona una clase ContextWrapper
que se crea en torno a un Context
existente mediante:
ContextWrapper wrapper = new ContextWrapper(context);
La ventaja de utilizar un ContextWrapper
es que le permite “modificar el comportamiento sin cambiar el contexto original”. Por ejemplo, si tiene una actividad llamada myActivity
continuación, puede crear un View
con un tema diferente que myActivity
:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
es realmente de gran alcance, ya que le permite anular la mayoría de las funciones proporcionadas por Context
incluyendo el código para acceder a los recursos (por ejemplo, openFileInput()
, getString()
), interactuar con otros componentes (por ejemplo, sendBroadcast()
, registerReceiver()
), solicitar permisos (por ejemplo, checkCallingOrSelfPermission()
) y resolver las ubicaciones del sistema de archivos (por ejemplo, getFilesDir()
). ContextWrapper
es realmente útil para evitar problemas específicos de dispositivos/versiones o para aplicar personalizaciones únicas a componentes como Vistas que requieren un contexto.
El método getBaseContext() se puede utilizar para acceder al contexto "base" que se ajusta al ContextWrapper
. Es posible que necesite acceder al contexto “base”, si es necesario, por ejemplo, comprobar si se trata de un 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 si es necesario llamar a la versión de “envolver” de un método:
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}
Hay una excelente valoración crítica en la primera respuesta: http://stackoverflow.com/questions/1026973/android-whats-the-difference-between-the-various-methods-to-get -a-context – ky1enamic
Posible duplicado de [¿Cuál es la diferencia entre los distintos métodos para obtener un contexto?] (https://stackoverflow.com/questions/1026973/whats-the-difference-between-the- various-methods-to -get-a-context) –