¿Cuál es la diferencia entre getContext()
, getApplicationContext()
, getBaseContext()
, y " this
"?
Aunque esta es una pregunta simple, no puedo entender la diferencia básica entre ellos. Por favor, da algunos ejemplos fáciles si es posible.
android
this
android-context
iCurious
fuente
fuente
Respuestas:
View.getContext()
: Devuelve el contexto en el que la vista se está ejecutando actualmente. Por lo general, la actividad actualmente activa.Activity.getApplicationContext()
: Devuelve el contexto de toda la aplicación (el proceso en el que se ejecutan todas las actividades). Use esto en lugar del contexto de Actividad actual si necesita un contexto vinculado al ciclo de vida de toda la aplicación, no solo a la Actividad actual.ContextWrapper.getBaseContext()
: Si necesita acceder a un contexto desde otro contexto, utilice ContextWrapper. El contexto al que se hace referencia desde dentro de ese ContextWrapper se accede a través de getBaseContext ().fuente
this
ygetContext()
no siempre son iguales, por ejemplo, en la clase Actividad, puede usarlothis
porqueActivity
heredaContext
pero el métodogetContext()
no está enActivity
clase. @mikedroid @KCRajuLa mayoría de las respuestas ya cubren
getContext()
ygetApplicationContext()
pero getBaseContext () rara vez se explican.El método
getBaseContext()
solo es relevante cuando tienes unContextWrapper
. Android proporciona unaContextWrapper
clase que se crea alrededor de una existenteContext
usando:El beneficio de usar a
ContextWrapper
es que te permite "modificar el comportamiento sin cambiar el contexto original". Por ejemplo, si tiene una actividad llamadamyActivity
, puede crear unaView
con un tema diferente amyActivity
:ContextWrapper
es realmente poderoso porque le permite anular la mayoría de las funciones proporcionadas alContext
incluir código para acceder a recursos (por ejemploopenFileInput()
,getString()
), interactuar con otros componentes (por ejemplosendBroadcast()
,registerReceiver()
), solicitar permisos (por ejemplocheckCallingOrSelfPermission()
) y resolver ubicaciones del sistema de archivos (por ejemplogetFilesDir()
).ContextWrapper
es realmente útil para solucionar problemas específicos del dispositivo / versión 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
ContextWrapper
envuelve. Es posible que necesite acceder al contexto “base”, si es necesario, por ejemplo, comprobar si se trata de unaService
,Activity
oApplication
:O si necesita llamar a la versión "sin envolver" de un método:
fuente
ContextWrapper
es una de las peores decisiones jamás tomadas por los desarrolladores de Android Framework. Cuando se dieron cuenta de que habían creado una familia completa de Objetos de Dios, en lugar de hacer lo correcto y refactorizar el código hacia la Responsabilidad Única, agregaron un truco feo que permitió cambiar el comportamiento del Contexto al profundizar el árbol de herencia. Mala ingeniería de software en su forma más fea. En cuanto a nosotros, los desarrolladores, en mi humilde opinión, nadie debería usargetBaseContext()
oContextWrapper
. Si lo hace, es un gran "olor a código".CustomToast
código completo . THANKS :)))fuente
La pregunta "cuál es el contexto" es una de las preguntas más difíciles en el universo de Android.
El contexto define métodos que acceden a los recursos del sistema, recuperan los activos estáticos de la aplicación, verifican los permisos, realizan manipulaciones de la interfaz de usuario y muchos más. En esencia,
Context
es un ejemplo de Dios Objeto antipatrón en producción.Cuando se trata de qué tipo de
Context
deberíamos usar, se vuelve muy complicado porque, excepto por ser el Objeto de Dios, el árbol jerárquico de lasContext
subclases viola brutalmente el Principio de sustitución de Liskov.Esta publicación de blog intenta resumir la
Context
aplicabilidad de clases en diferentes situaciones.Permítanme copiar la tabla principal de esa publicación para completar:
fuente
Context
proporciona información sobre elActvity
oApplication
los componentes de nueva creación.Pertinente
Context
Se debe proporcionar a los componentes recién creados (ya sea el contexto de la aplicación o el contexto de la actividad)Como
Activity
es una subclase deContext
, uno puede usarthis
para obtener el contexto de esa actividadfuente
De estos documentos
Comprendí que deberías usar:
fuente
getApplicationContext ()
getContext () y getBaseContext ()
esta
fuente
A
Context
es:fuente