Vamos a mantenerlo simple.
La documentación oficial de Android sobre el Contexto dice que es una -
Interfaz a la información global sobre el entorno de una aplicación
Así que, básicamente, este es el objeto que el tiempo de ejecución de Android entrega a cada = Aplicación Android que se inicia. Contiene toda la información global que la aplicación necesita saber - recursos de cadena, recursos de imagen, componentes de Android en la aplicación (Servicio de Actividad, Receptor de Transmisión y Proveedor de Contenido).
Muchos desarrolladores inexpertos cometen el error de asumir que sólo hay una única instancia de esta clase - lo que conducirá a fugas de memoria en la aplicación de Android.
Cuando hacesApplicationContext() obtienes un objeto Singleton Context. Pero cuando haces el getContext() no obtienes el mismo contexto Singleton. Cada Actividad obtiene su propia instancia de Contexto (sólo imprime el hashcode del objeto contexto). Incluso los servicios obtienen su propia instancia del objeto Contexto.
Si no se presta atención a este pequeño detalle, las aplicaciones Android tendrán un bajo rendimiento e incluso podrán colapsar. Personalmente creo que este es el concepto más incomprendido en el desarrollo de aplicaciones Android.
Si quieres más detalles sobre lo que conduce a la fuga de memoria, cómo detectarla, por qué sucede y cómo evitarla no dudes en visitar esta serie de vídeos.