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 ActivityTestCasesin embargo, burlándose de la aplicación hará getApplication()volver con la maqueta, pero getApplicationContexttodaví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 getApplicationdefine en Activityy Service, pero no en Context? ¿No debería haber siempre una instancia de aplicación válida disponible desde cualquier lugar ?

Applicationobjeto 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.Applicationes super ayuda completa. Por ejemplo, tuve un sinfín de problemas para inicializar la base de datos. Una vez que se mudó aApplication.onCreateella funcionó como un encanto. Ahora hago toda la inicialización de todo el sistemaApplicationy no escribiría otra aplicación sin ella.Compara
getApplication()ygetApplicationContext().getApplicationdevuelve unApplicationobjeto que le permitirá administrar el estado global de su aplicación y responder a algunas situaciones del dispositivo, comoonLowMemory()yonConfigurationChanged().getApplicationContextdevuelve 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
Applicationes aContext(se hereda de él), y en tiempo de ejecución, ambos métodos devuelven la misma instancia. Entonces, ¿cuál es la diferencia?Activitycontexto y unApplicationcontexto. Estoy reflexionando sobre la diferencia entreApplication(que es el contexto de aplicación global único) y lo que sea quegetApplicationContextregrese. 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
Contextson 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 elApplicationobjeto 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
Applicationobjeto. La utilidad de esto, creo, es que se puede crear y registrar en el manifiesto de una clase personalizada derivada deApplicationy 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 deApplicationla clase y el uso por cualquier Propósito personalizado.En otras palabras,
getApplication()se garantiza que devolverá unApplicationobjeto, 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