Contexto

¿Qué es eso del Contexto?

El contexto es el estado actual de la aplicación o el objeto que instancia la clase Context. Permite acceder a información relativa a la aplicación o el objeto e instanciar elementos de la aplicación. Es como un acceso al conjunto de información de estado de la aplicación.

Android context, una de las clases abstractas que resultan de suma importancia para el desarrollo de una app para el sistema operativo Android.

Podemos verlo como un elemento del sistema que nos proporciona servicios de resolución de recursos, permitiendo obtener acceso a bases de datos, preferencias, etc.
A grandes rasgos se trata de un objeto se necesita para acceder a todos los recursos del sistema.

Se considera una clase abstracta que nosotros como desarrolladores, directamente, no podemos crear, debido a que es uno de los objetos que crea el propio sistema.
Muchos de los componentes que se suelen utilizar en el desarrollo de una app Android heredan de clases context,

El objeto Activity hereda de la clase Context, por lo que es un Contexto con acceso al estado de la Aplicación (y por supuesto de la Activity).
Es decir, por ser un contexto, la Activity y sus elementos podrán acceder a recursos de la aplicación.

Entonces, como ya hemos mencionado, la clase context se utiliza para la obtención de recursos específicos de la aplicación; no obstante, es oportuno resaltar que existen diferentes tipos de lo qué es context en Android. Estos tipos son:

  • Application.
  • Activity.
  • Service.
  • BroadCastReciver.
  • ContentProvider.

El hecho de que todos sean considerados como context no nos garantiza que podamos acceder a los mismos recursos.
Cada uno de estos objetos tiene una información diferente.
De modo que, dependiendo de cuándo o dónde lo vayamos a utilizar, nos va a dar una información u otra.

Un uso erroneo del Context a utilizar en distintos puntos de la aplicación puede generar una “fuga de memoria”, un “memory leak”, quedándonos sin recursos y pudiendo bloquear la aplicación.

¿Singleton?

The Singleton’s purpose is to control object creation, limiting the number of objects to only one. Since there is only one Singleton instance, any instance fields of a Singleton will occur only once per class, just like static fields. Singletons often control access to resources, such as database connections or sockets. TutorialsPoint

En el código Android veras que se accede al Application Context o al Activity Context. ¿Qué diferencia hay?

Application Context

Es una clase Singleton del contexto de la Aplicación, por lo que sólo hay una instancia  del Contexto global a toda la aplicación.  Este contexto está vinculado al ciclo de vida de la aplicación.

Puede ser accedido mediante la llamada a getApplicationContext() desde cualquier parte de la aplicación.

Cuando se necesitas un Contexto para un componente de tu aplicación, que estás creando o llamando desde el componente actual (por ejemplo una Activity) y cuyo ciclo de vida estará separado del ciclo de vida del componente actual, necesitarás acceder al contexto de la aplicación, puesto que el elemento actual puede desaparecer antes que el que estás creando, tienen ciclos de vida diferentes.

Por ejemplo, si creas un objeto a nivel aplicación, éste necesitará un contexto, en ese caso usa el contexto de la aplicación. Si pasas el contexto de la Activity, vas a ocasionar una “fuga de memoria”, puesto que el objeto a nivel aplicación mantendrá la referencia al Contexto de la Activity, por lo que cuando la Activity se tenga que destruir, será imposible, pues hay referencias hacia ella, manteniéndose en memoria recursos innecesarios. Si vuelves a abrir la Actividad que instancia el objeto global se creará una nueva Activity que será nuevamente vinculada y que tampoco será liberada de memoria por el Garbage Collector, consumiendo más y más memoria conforme se use la aplicación.

Sólo usarás getApplicationContext() cuando sepas que vas a necesitar un Context para algo que va a vivir más que cualquier otro Context que tengas a disposición para usar.

Activity Context

Este contexto está disponible en el Activity, pues hereda de Context. Está vinculado al ciclo de vida de la Activity. Mientras estés en el ámbito de la Activity podrás pasar este contexto, o cuando necesitas concretamente el contexto vinculado al ciclo de vida actual.

Si estás creando un Toast para ser mostrado desde un Activity en curso, usarás el contexto del Activity. En general cuando estás creando un objeto cuyo ciclo de vida está ligado a la activity, es decir, cuando la Activity muera, el objeto también deberá morir.

Aunque estés en un Activity y puedas acceder al Contexto de la Aplicación, este no contiene algunas cosas relativas al GUI (Graphic User Interface) por lo que puede fallar. Usa el contexto de la Activity para cuestiones de interface de usuario

ContentProvider

Cuando usamos getContext() en un ContentProvider estamos accediendo al contexto de la aplicación, al Application Context.