En varios bits de código de Android que he visto:
public class MyActivity extends Activity {
public void method() {
mContext = this; // since Activity extends Context
mContext = getApplicationContext();
mContext = getBaseContext();
}
}
Sin embargo, no puedo encontrar ninguna explicación decente sobre cuál es preferible y bajo qué circunstancias se debe usar.
Se agradecerían los consejos sobre la documentación sobre esto y la orientación sobre lo que podría romperse si se elige el equivocado.
android
android-context
Alnitak
fuente
fuente
Respuestas:
Estoy de acuerdo en que la documentación es escasa cuando se trata de Contextos en Android, pero puede recopilar algunos datos de varias fuentes.
Esta publicación de blog en el blog oficial de desarrolladores de Google Android se escribió principalmente para ayudar a abordar las fugas de memoria, pero también proporciona buena información sobre los contextos:
Leer el artículo un poco más sobre la diferencia entre los dos y cuándo podría considerar usar el contexto de la aplicación (
Activity.getApplicationContext()
) en lugar de usar el contexto de la actividadthis
). Básicamente, el contexto de la aplicación está asociado con la aplicación y siempre será el mismo durante todo el ciclo de vida de su aplicación, mientras que el contexto de la actividad está asociado con la actividad y podría destruirse muchas veces a medida que la actividad se destruye durante los cambios de orientación de la pantalla y tal.Realmente no pude encontrar nada sobre cuándo usar getBaseContext () aparte de una publicación de Dianne Hackborn, uno de los ingenieros de Google que trabaja en el SDK de Android:
Eso fue de una publicación en el grupo de noticias de desarrolladores de Android , es posible que desee considerar hacer su pregunta allí también, porque un puñado de las personas que trabajan en Android monitorean ese grupo de noticias y responden preguntas.
Entonces, en general, parece preferible usar el contexto de aplicación global cuando sea posible.
fuente
Don't use getBaseContext()
. ¿Alguien podría aclarar esto?Esto es lo que he encontrado con respecto al uso de
context
:1) Dentro de un
Activity
mismo,this
úselo para inflar diseños y menús, registrar menús contextuales, crear widgets de instancias, iniciar otras actividades, crear nuevosIntent
dentro deActivity
, preferencias de instancia u otros métodos disponibles en unActivity
.Diseño inflado:
Inflar menú:
Menú contextual de registro:
Reproductor de instancia:
Comience un
Activity
:Instanciar preferencias:
2) Para la clase de toda la aplicación, use
getApplicationContext()
como este contexto existe para la vida útil de la aplicación.Recupere el nombre del paquete actual de Android:
Enlace una clase de toda la aplicación:
3) Para los oyentes y otro tipo de clases de Android (por ejemplo, ContentObserver), use una sustitución de contexto como:
donde
this
ocontext
es el contexto de una clase (Actividad, etc.).Activity
sustitución de contexto:Sustitución del contexto del oyente:
ContentObserver
sustitución de contexto:4) Para
BroadcastReceiver
(incluido el receptor integrado / en línea), use el contexto propio del receptor.Externo
BroadcastReceiver
:En línea / incrustado
BroadcastReceiver
:5) Para los Servicios, use el contexto propio del servicio.
6) Para tostadas, generalmente use
getApplicationContext()
, pero cuando sea posible, use el contexto pasado de una Actividad, Servicio, etc.Utilice el contexto de la aplicación:
Usar contexto pasado de una fuente:
Y por último, no lo use
getBaseContext()
según lo aconsejado por los desarrolladores de framework de Android.ACTUALIZACIÓN: Agregue ejemplos de
Context
uso.fuente
OuterClass.this
; ver comentarios en stackoverflow.com/questions/9605459/…Leí este hilo hace unos días, haciéndome la misma pregunta. Mi decisión después de leer esto fue simple: siempre use applicationContext.
Sin embargo, encontré un problema con esto, pasé unas horas para encontrarlo y unos segundos para resolverlo ... (cambiando una palabra ...)
Estoy usando un LayoutInflater para inflar una vista que contiene un Spinner.
Así que aquí hay dos posibilidades:
1)
2)
Entonces, estoy haciendo algo como esto:
Lo que noté: si instanciaste tu diseño lineal con el contexto de la aplicación, cuando hagas clic en el spinner en tu actividad, tendrás una excepción no detectada, proveniente de la máquina virtual dalvik (no de tu código, es por eso que he gastado mucho) de tiempo para encontrar dónde fue mi error ...).
Si usa el baseContext, entonces está bien, el menú contextual se abrirá y podrá elegir entre sus opciones.
Así que aquí está mi conclusión: supongo (no lo he probado más) que el baseContext se requiere cuando se trata de contextMenu en su Actividad ...
La prueba se realizó con la codificación API 8 y se probó en un HTC Desire, Android 2.3.3.
Espero que mi comentario no te haya aburrido hasta ahora y te deseo todo lo mejor. Feliz codificación ;-)
fuente
Primero, estoy de acuerdo en que deberíamos usar appcontext siempre que sea posible. entonces "esto" en actividad. Nunca he necesitado el contexto base.
En mis pruebas, en la mayoría de los casos se pueden intercambiar. En la mayoría de los casos, la razón por la que desea obtener un contexto es para acceder a archivos, preferencias, base de datos, etc. Estos datos eventualmente se reflejan como archivos en la carpeta de datos privados de su aplicación (/ data / data /). Independientemente del contexto que utilice, se asignarán a la misma carpeta / archivos para que esté bien.
Eso es lo que observé. Tal vez hay casos en los que debería distinguirlos.
fuente
En algunos casos, puede usar el contexto de actividad sobre el contexto de la aplicación al ejecutar algo en un hilo. Cuando el subproceso completa la ejecución y necesita devolver el resultado a la actividad del llamador, necesita ese contexto con un controlador.
fuente
En palabras simples
getApplicationContext()
como sugiere el nombre del método, su aplicación estará al tanto de todos los detalles de la aplicación a los que puede acceder desde cualquier lugar de la aplicación. Por lo tanto, puede hacer uso de esto en el enlace de servicio, el registro de transmisión, etc.Application context
estará activo hasta que la aplicación salga.getActivity()
othis
hará que su aplicación esté al tanto de la pantalla actual que también es visible y los detalles del nivel de la aplicación proporcionados porapplication context
. Entonces, todo lo que quieras saber sobre la pantalla actualWindow
ActionBar
Fragementmanger
y, por lo tanto, está disponible con este contexto. Básicamente yActivity
extenderContext
. Este contexto seguirá vivo hasta que el componente actual (actividad) esté vivofuente
¿Qué es un contexto? Personalmente, me gusta pensar en Context como el estado de su solicitud en un momento dado. El contexto de la aplicación representa una configuración global o base de su aplicación y una Actividad o Servicio puede basarse en ella y representa una instancia de configuración de su Aplicación o un estado transitivo para ella.
Si observa la fuente de android.content.Context, verá que Context es una clase abstracta y los comentarios sobre la clase son los siguientes:
Interfaz con información global sobre un entorno de aplicación. Esta es una clase abstracta cuya implementación es proporcionada por el sistema Android. Permite el acceso a
application-specific
recursos y clases, así como llamadas paraapplication-level
operaciones tales como actividades de lanzamiento, difusión y recepción de intenciones, etc. Lo que quito de esto es que Context proporciona una implementación común para acceder a nivel de aplicación y nivel de sistema recursos Los recursos a nivel de aplicación pueden estar accediendo a cosas como recursos de cadena[getResources()]
o activos[getAssets()]
y el recurso a nivel de sistema es cualquier cosa a la que accedaContext.getSystemService().
De hecho, eche un vistazo a los comentarios sobre los métodos y parecen reforzar esta noción:
getSystemService()
: Devuelva el identificador a unsystem-level
servicio por su nombre. La clase del objeto devuelto varía según el nombre solicitado.getResources()
: Devuelve una instancia de Recursos para el paquete de su aplicación.getAssets()
: Devuelve una instancia de Recursos para el paquete de su aplicación. ¡Vale la pena señalar que en la clase abstracta Context, todos los métodos anteriores son abstractos! Solo una instancia de getSystemService (Class) tiene una implementación y eso invoca un método abstracto. Esto significa que la implementación de estos debe ser proporcionada principalmente por las clases de implementación, que incluyen:Mirando la documentación de la API, la jerarquía de las clases se ve así:
Contexto
El | - ContextWrapper
| - - Aplicación
El | - - ContextThemeWrapper
| - - - - Actividad
El | - - Servicio
| - - - IntentService
Como sabemos que en
Context
sí mismo no proporciona ninguna información, nos movemos hacia abajo del árbol y echamos un vistazo alContextWrapper
y nos damos cuenta de que tampoco hay mucho allí. Dado que la aplicación se extiendeContextWrapper
, tampoco hay mucho que ver allí, ya que no anula la implementación proporcionada porContextWrapper
. Esto significa que la implementación del contexto la proporciona el sistema operativo y está oculta para elAPI
. Puede echar un vistazo a la implementación concreta de Context mirando la fuente de la clase ContextImpl.fuente
Solo he usado esto y
getBaseContext
al tostar desde unonClick
novato muy verde para Java y Android. Lo uso cuando mi clicker está directamente en la actividad y tengo que usarlogetBaseContext
en un clicker interno anónimo. Supongo que eso es más o menos el trucogetBaseContext
, tal vez es devolver el contexto de la actividad en la que se oculta la clase interna.fuente
MyActivity.this
. Usar el contexto base como lo describe probablemente no causará problemas, pero está mal.