No pude encontrar una respuesta satisfactoria a esto, así que aquí vamos: ¿cuál es el trato Activity/Service.getApplication()
y Context.getApplicationContext()
?
En nuestra aplicación, ambos devuelven el mismo objeto. En una ActivityTestCase
sin embargo, burlándose de la aplicación hará getApplication()
volver con la maqueta, pero getApplicationContext
todavía devolver una instancia de contexto diferente (uno inyectado por Android). ¿Eso es un error? ¿Es a propósito?
Ni siquiera entiendo la diferencia en primer lugar. ¿Hay casos fuera de un conjunto de pruebas donde ambas llamadas pueden volver con diferentes objetos? ¿Cuándo y por qué? Además, ¿por qué se getApplication
define en Activity
y Service
, pero no en Context
? ¿No debería haber siempre una instancia de aplicación válida disponible desde cualquier lugar ?
Application
objeto en su aplicación.Respuestas:
Pregunta muy interesante Creo que es principalmente un significado semántico, y también puede deberse a razones históricas.
Aunque en las implementaciones actuales de Android Activity and Service,
getApplication()
ygetApplicationContext()
devuelve el mismo objeto, no hay garantía de que este sea siempre el caso (por ejemplo, en una implementación específica del proveedor).Entonces, si desea la clase de Aplicación que registró en el Manifiesto, nunca debe llamarla
getApplicationContext()
y enviarla a su aplicación, porque puede que no sea la instancia de la aplicación (que obviamente experimentó con el marco de prueba).¿Por qué
getApplicationContext()
existe en primer lugar?getApplication()
solo está disponible en la clase Actividad y la clase Servicio, mientras quegetApplicationContext()
se declara en la clase Contexto.Eso realmente significa una cosa: cuando se escribe código en un receptor de difusión, que no es un contexto pero se le da un contexto en su método onReceive, solo puede llamar
getApplicationContext()
. Lo que también significa que no se garantiza que tenga acceso a su aplicación en un BroadcastReceiver.Cuando mira el código de Android, ve que cuando se adjunta, una actividad recibe un contexto base y una aplicación, y esos son parámetros diferentes.
getApplicationContext()
delegados a los que está llamadobaseContext.getApplicationContext()
.Una cosa más: la documentación dice que en la mayoría de los casos, no debería necesitar subclasificar la aplicación:
Sé que esta no es una respuesta exacta y precisa, pero aún así, ¿eso responde a su pregunta?
fuente
android.app.Application
es super ayuda completa. Por ejemplo, tuve un sinfín de problemas para inicializar la base de datos. Una vez que se mudó aApplication.onCreate
ella funcionó como un encanto. Ahora hago toda la inicialización de todo el sistemaApplication
y no escribiría otra aplicación sin ella.Compara
getApplication()
ygetApplicationContext()
.getApplication
devuelve unApplication
objeto que le permitirá administrar el estado global de su aplicación y responder a algunas situaciones del dispositivo, comoonLowMemory()
yonConfigurationChanged()
.getApplicationContext
devuelve el contexto de aplicación global: la diferencia con respecto a otros contextos es que, por ejemplo, un contexto de actividad puede ser destruido (o no estar disponible) por Android cuando finaliza su actividad. El contexto de la aplicación permanece disponible todo el tiempo que exista el objeto de la aplicación (que no está vinculado a un específicoActivity
), por lo que puede usarlo para cosas como las notificaciones que requieren un contexto que estará disponible por períodos más largos e independiente de los objetos de IU transitorios.Supongo que depende de lo que esté haciendo su código si estos pueden o no ser los mismos, aunque en uso normal, esperaría que fueran diferentes.
fuente
Application
es aContext
(se hereda de él), y en tiempo de ejecución, ambos métodos devuelven la misma instancia. Entonces, ¿cuál es la diferencia?Activity
contexto y unApplication
contexto. Estoy reflexionando sobre la diferencia entreApplication
(que es el contexto de aplicación global único) y lo que sea quegetApplicationContext
regrese. Este último no era funcional antes de Android 1.6; solía volver siemprenull
.Parece tener que ver con el ajuste de contexto. La mayoría de las clases derivadas
Context
son en realidad aContextWrapper
, que esencialmente delega a otro contexto, posiblemente con cambios por el contenedor.El contexto es una abstracción general que admite burlas y representación. Dado que muchos contextos están vinculados a un objeto de vida limitada, como un
Activity
, debe existir una forma de obtener un contexto de vida más larga, para fines tales como registrarse para futuras notificaciones. Eso se logra medianteContext.getApplicationContext()
. Una implementación lógica es devolver elApplication
objeto global , pero nada impide que una implementación de contexto devuelva un contenedor o proxy con una vida útil adecuada.Las actividades y servicios están más específicamente asociados con un
Application
objeto. La utilidad de esto, creo, es que se puede crear y registrar en el manifiesto de una clase personalizada derivada deApplication
y estar seguro de queActivity.getApplication()
oService.getApplication()
va a devolver ese objeto específico de ese tipo específico, que puede convertir a su derivado deApplication
la clase y el uso por cualquier Propósito personalizado.En otras palabras,
getApplication()
se garantiza que devolverá unApplication
objeto, mientras quegetApplicationContext()
es libre de devolver un proxy en su lugar.fuente
Para responder la pregunta, getApplication () devuelve un objeto Application y getApplicationContext () devuelve un objeto Context. Basado en sus propias observaciones, supongo que el Contexto de ambos es idéntico (es decir, detrás de escena, la clase Aplicación llama a la última función para llenar la porción de Contexto de la clase base o se lleva a cabo alguna acción equivalente). Realmente no debería importar a qué función llame si solo necesita un Contexto.
fuente