Saturday 14 December 2013

Il componente Application

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.


public class MiaApplication extends Application {
    private ConcurrentHashMap<String, String> variabiliGlobali;
    private Set<AppStateListener> mieiAppStateListeners;

    @Override
    public void onCreate() {
        super.onCreate();

        //chiamato prima della creazione di qualsiasi altro componente  
        variabiliGlobali = new ConcurrentHashMap<String, String>();
                mieiAppStateListeners = Collections.synchronizedSet(newHasSet<AppStateListeners>());
    }

    public String getVariabileGlobale(String chiave) {
        return variabiliGlobali.get(chiave);
    }

    public String rimuoviVariabileGlobale(String chiave) {
        String valore = variabiliGlobali.remove(chiave);
        notificaListeners(chiave, null);
        return valore;
    }

    public void inserisciVariabileGlobale(String chiave, String valore) {
        variabiliGlobali.put(chiave, valore);
        notificaListeners(chiave, valore);
    }   
        public void aggiungiAppStateListener(AppStateListener appStateListener) {
        mieiAppStateListeners.add(appStateListener);
    }

    public void rimuoviAppStateListener(AppStateListener appStateListener) {
        mieiAppStateListeners.remove(appStateListener); 
    }

    private void notificaListeners(String chiave, String valore) {  
        for(AppStateListener appStateListener : mieiAppStateListeners) {
            appStateListener.onStateChanged(chiave, valore);
        }
    }

    public interface AppStateListener { 
        void onStateChanged(String chiave, String valore);
    }
}


Ora che abbiamo definito  la nostra classe personalizzata MiaApplication, dobbiamo specificarla nel file Manifest della nostra app.

<application android:label="@string/app_name"
    android:icon="@drawable/app_icon"
    android:name=".MiaApplication">

<!-- ecc. ecc. -->
</application>


Vediamo ora come utilizzare la nostra classe personalizzata MiaApplication in una ipotetica Activity:

public class MiaActivity extends Activity implements MiaApplication.AppStateListener {
    
    @Override
    protected void onResume() {
        super.onResume();
        MiaApplication miaApplication = (MiaApplication) getApplication();
        miaApplication.aggiungiAppStateListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        MiaApplication miaApplication = (MiaApplication) getApplication();
        miaApplication.rimuoviAppStateListener(this);
    }

    @Override
    public void onStateChanged(String chiave, String valore) {
        //gestire il cambiamento delle variabili globali
    }
}


Naturalmente per aggiungere una variabile globale si userà un'istruzione del tipo:

miaApplication.inserisciVariabileGlobale(chiave, valore);

questo automaticamente chiamerà onStateChanged su tutti i componenti che implementano l'interfaccia MiaApplication.AppStateListener.

No comments:

Post a Comment