Nelle app Android il componente Application è poco conosciuto ed utilizzato, tuttavia può tornare utile in determinate situazioni.
Application è il componente che sta sopra tutti gli altri, Activity, Service e BroadcastReceiver compresi.
Ogni app Android ha un componente Application: se il programmatore non ne specifica uno, ne viene creato automaticamente uno di default.
Per ottenere un reference a questo componente si usa il comando Context.getApplication().
Siccome il componente Application è unico per ogni app Android, lo si può utilizzare per condividere variabili globali tra i vari componenti della nostra app (ad esempio tra le varie Activity).
Vediamo quindi un esempio di come sfruttare il componente Application per condividere delle variabili globali tra i vari componenti della nostra app. Ogni volta che una variabile globale di Application viene modificata, tutti i componenti (ad es. le varie Activity) riceveranno una notifica.
1
2public class MiaApplication extends Application {
3private ConcurrentHashMap<String, String> variabiliGlobali;
4private Set<AppStateListener> mieiAppStateListeners;
5
6
7public void onCreate() {
8super.onCreate();
9
10//chiamato prima della creazione di qualsiasi altro componente
11variabiliGlobali = new ConcurrentHashMap<String, String>();
12mieiAppStateListeners = Collections.synchronizedSet(newHasSet<AppStateListeners>());
13}
14
15public String getVariabileGlobale(String chiave) {
16return variabiliGlobali.get(chiave);
17}
18
19public String rimuoviVariabileGlobale(String chiave) {
20String valore = variabiliGlobali.remove(chiave);
21notificaListeners(chiave, null);
22return valore;
23}
24
25public void inserisciVariabileGlobale(String chiave, String valore) {
26variabiliGlobali.put(chiave, valore);
27notificaListeners(chiave, valore);
28}
29public void aggiungiAppStateListener(AppStateListener appStateListener) {
30mieiAppStateListeners.add(appStateListener);
31}
32
33public void rimuoviAppStateListener(AppStateListener appStateListener) {
34mieiAppStateListeners.remove(appStateListener);
35}
36
37private void notificaListeners(String chiave, String valore) {
38for(AppStateListener appStateListener : mieiAppStateListeners) {
39appStateListener.onStateChanged(chiave, valore);
40}
41}
42
43public interface AppStateListener {
44void onStateChanged(String chiave, String valore);
45}
46}
47
Come si vede, nella classe MiaApplication abbiamo anche definito un interfaccia, AppStateListener, che dovrà essere implementata da ogni componente della nostra App (Activity, ecc.) nel quale vogliamo utilizzare le variabili globali.
Ora che abbiamo definito la nostra classe personalizzata MiaApplication, dobbiamo specificarla nel file Manifest della nostra app.
81
2<application android:label="@string/app_name"
3android:icon="@drawable/app_icon"
4android:name=".MiaApplication">
5
6<!-- ecc. ecc. -->
7</application>
8
Vediamo ora come utilizzare la nostra classe personalizzata MiaApplication in una ipotetica Activity:
231
2public class MiaActivity extends Activity implements MiaApplication.AppStateListener {
3
4
5protected void onResume() {
6super.onResume();
7MiaApplication miaApplication = (MiaApplication) getApplication();
8miaApplication.aggiungiAppStateListener(this);
9}
10
11
12protected void onPause() {
13super.onPause();
14MiaApplication miaApplication = (MiaApplication) getApplication();
15miaApplication.rimuoviAppStateListener(this);
16}
17
18
19public void onStateChanged(String chiave, String valore) {
20//gestire il cambiamento delle variabili globali
21}
22}
23
Naturalmente per aggiungere una variabile globale si userà un'istruzione del tipo:
31
2miaApplication.inserisciVariabileGlobale(chiave, valore);
3
questo automaticamente chiamerà onStateChanged su tutti i componenti che implementano l'interfaccia MiaApplication.AppStateListener.