android - programacion - Necesitando contexto en clases que no son de actividad
manual de android en pdf (7)
Tengo algunas clases dentro de mi aplicación que necesitan llamar a las funciones de Android que requieren el contexto como parámetro. No lo tengo porque la clase no es una subclase de la clase Activity.
¿Cuál es la forma correcta de abordar este problema?
- Pasarlo como un parámetro en cada llamada?
- Pasarlo a instanciación de clase y guardarlo?
Casi siempre voy con un enfoque de parámetro de constructor. Lo paso en la creación de instancias y mantengo una referencia privada en la clase instanciada.
Tienes que pensar en una cosa importante. Si la clase a la que le pasa el Context
existirá por más tiempo que la Activity
instantándola, entonces debe usar el contexto de la aplicación. Si esa clase está haciendo cosas de UI necesitarás un contexto de actividad.
Asegúrate de que la clase a la que le pasas el contexto de actividad no durará más que la Activity
o perderás toda la actividad.
Si no haces cosas de UI, entonces ve al contexto de la aplicación.
He respondido esta pregunta here también.
Puede hacerlo usando ContextWrapper
, como se describe aquí.
Por ejemplo:
public class MyContextWrapper extends ContextWrapper {
public MyContextWrapper(Context base) {
super(base);
}
}
y use esa clase como si fuera Contexto
La mejor manera es seguir el enfoque de Bean:
public class Example {
protected Context getContext() {
...
}
...
}
Entonces depende de las posibilidades de acceder al contexto. Si la clase es completamente independiente, entonces el parámetro de constructor y el campo privado parecen ser el mejor enfoque.
Pero esa propiedad de frijol te protege de más cambios de código.
Lo paso como un parámetro, creo que es la mejor forma de hacerlo
Pásalo a la creación de instancias de clases y guárdalo.
Un ejemplo típico es cuando creas un db helper. Ver este link
Pásalo como un parámetro. O mejor aún, obtenga el contexto de la aplicación para evitar pérdidas de memoria.
public class Example {
protected Context context;
public Example(Context context){
this.context = context.getApplicationContext();
}
}
Depende del rol de la clase. Pero, de todos modos, pasa ApplicationContext
pero no la Actividad uno. Si pasa el contexto de actividad, gc no puede eliminarlo de la memoria cuando ya no necesite más actividad. Pero el contexto de la aplicación se usa mientras la aplicación no fue terminada por el SO. Se recomienda evitar las fugas de memoria.