Cada uno de los componentes de una aplicación se escribe en una clase separada. Esto hace que en muchas ocasiones resulte complicado compartir objetos entre estos componentes.
Para poder acceder a una información global desde cualquier clase de nuestro proyecto, podemos utilizar el modificador static. De esta forma, no será necesario conocer la referencia a un objeto de la clase, solo con indicar el nombre de la clase podremos acceder a esta información.
Otra alternativa, muy similar a la anterior, es utilizar el patrón Singleton. Una clase definida con este patrón solo dispondrá de una instancia a la que se podrá acceder desde cualquier sitio utilizando un método estático. Lo veremos en el capítulo 3. Una tercera alternativa específica de Android consiste en crear un descendiente de la clase Application. En el siguiente punto se explica cómo hacerlo.
La clase Application:
Cada uno de los componentes de una aplicación se escribe en una clase separada. Esto hace que en muchas ocasiones resulte complicado compartir objetos entre estos componentes.
Para poder acceder a una información global desde cualquier clase de nuestro proyecto, podemos utilizar el modificador static. De esta forma, no será necesario conocer la referencia a un objeto de la clase, solo con indicar el nombre de la clase podremos acceder a esta información.
Otra alternativa, muy similar a la anterior, es utilizar el patrón Singleton. Una clase definida con este patrón solo dispondrá de una instancia a la que se podrá acceder desde cualquier sitio utilizando un método estático. Lo veremos en el capítulo 3. Una tercera alternativa específica de Android consiste en crear un descendiente de la clase Application. En el siguiente punto se explica cómo hacerlo.
Esta clase ha sido creada en Android para almacenar información global a toda la aplicación.
Veamos cómo usarla en tres pasos:
1.Crea un descendiente de Application que contenga la información global y los métodos asociados para acceder a esta información. Mira el ejemplo:
----------------
public class Aplicacion extends Application {
private int saldo;
@Override public void onCreate() {
SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
int saldo = pref.getInt("saldo_inicial", 0);
}
public int getSaldo(){
return saldo;
}
public void setSaldo(int saldo){
this.saldo=saldo;
}
}
----------------
En nuestra aplicación queremos que el usuario disponga de un saldo de puntos, con los que podrá ir desbloqueando ciertas características especiales. La clase Application es descendiente de Context, por lo que tendremos acceso a todos los métodos relativos a nuestro contexto. Entre estos métodos se incluye getSharedPreferences, para acceder a un fichero de preferencias almacenado en la memoria interna de nuestra aplicación. Además de poder sobrescribir el método onCreate(), la clase Application permite sobrescribir los siguientes.
onCreate() llamado cuando se cree la aplicación. Puedes usarlo para inicializar los datos.
onConfigurationChanged(Configuration nuevaConfig) llamado cuando se realicen cambios en la configuración del dispositivo, mientras que la aplicación se está ejecutando.
onLowMemory() llamado cuando el sistema se está quedando sin memoria. Trata de liberar toda la memoria que sea posible.
onTrimMemory(int nivel) (desde nivel API 14) llamado cuando el sistema determina que es un buen momento para que una aplicación recorte memoria. Esto ocurrirá, por ejemplo, cuando está en el fondo de la pila de actividades y no hay suficiente memoria para mantener tantos procesos en segundo plano. Además, se nos pasa como parámetro el nivel de necesidad. Algunos valores posibles son: TRIM_MEMORY_COMPLETE, TRIM_MEMORY_BACKGROUND, TRIM_MEMORY_MODERATE, …
2.Registra la clase creada en AndroidManifest. Para ello busca la etiqueta <application> y añade el atributo name, con el nombre de la clase creada:
...
<application
android:name="Aplicacion"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
--------------
android:theme="@style/AppTheme">
..-
3.Puedes obtener una referencia a tu clase Application con este código:
Aplicacion aplicacion = (Aplicacion) contexto.getApplicationContext();
Donde contexto es una referencia a la clase Context. En caso de estar en un descendiente de esta clase (como Activity, Service,…) no es necesario disponer de esta referencia, la misma clase ya es un Context. Por lo tanto, podríamos escribir:
Aplicacion aplicacion = (Aplicacion) getApplication();
o incluso directamente:
int miSaldo = ((Aplicacion) getApplication()).getSaldo();
int miSaldo = ((Aplicacion) getApplication()).getSaldo();
Ejercicio: Acceso a información global con la clase Application.
1.Crea un nuevo proyecto con los siguientes datos:
Application name: Audiolibros
Package name: com.example.audiolibros
Project location: <ruta a mis proyectos>\Audiolibros_v1
Phone and Tablet
Minimum SDK: API 16 Android 4.1 (Jelly Bean)
Add an activity: Basic Activity
Utiliza los valores por defecto en el resto de los campos.
2.Vamos a empezar creando una nueva clase. Para ello pulsa con el botón derecho sobre el java / com.example.audiolibros y selecciona New / Java Class. Introduce como nombre de la clase Aplicacion. En ella vamos a almacenar dos objetos que queremos usar globalmente en toda la aplicación, listaLibros y adaptador. Reemplaza su código por el siguiente: