2

Jul

Il multitasking in Mango – Qualche dettaglio più approfondito

Nel post precedente abbiamo visto il nuovo ciclo di vita delle applicazioni Windows Phone in Mango, la prossima major release del sistema operativo mobile di Microsoft. Abbiamo parlato dell’introduzione dello stato Dormant, in cui vengono portate di default le applicazioni quando vengono sospese. Abbiamo detto che in questo stato le applicazioni non sono più terminate, ma vengono “congelate”.

In questo post vedremo in dettaglio cosa si intende per “congelate”.

Sospensione dell’applicazione

In fase di sospensione dell’applicazione sono stati introdotti tutta una serie di accorgimenti per mantenere il processo in esecuzione senza però incidere eccessivamente sulla batteria e sulle performance della applicazione correntemente in uso. Ecco perciò che, innanzitutto, tutte le operazioni in esecuzione vengono terminate: un’applicazione in Dormant non è in grado di eseguire codice in background; per questo scopo sono stati introdotti i background agents, che vedremo in un secondo momento.

Vediamo in queso schema (tratto delle slide presentate al MIX) gli altri accorgimenti che il sistema operativo mette in atto in fase di sospensione:

table_activate

Come potete vedere, tutti i thread vengono interrotti e tutti gli oggetti che potrebbero continuare a consumare risorse vengono fermati, in alcuni casi temporaneamente (come l’audio), in alcuni casi definitivamente (come le socket e le connessioni alla rete). Nota a parte per le classi che interagiscono con la fotocamera, che non vengono solo scollegate ma definitivamente eliminate dalla memoria. Questo perchè la fotocamera è una risorsa ad accesso esclusivo: solo una applicazione alla volta può utilizzarla. 

Il punto di forza di questo sistema è che è tutto a carico del sistema operativo: non deve occuparsi lo sviluppatore di identificare e scollegare le risorse non più necessarie.

Restore dell’applicazione

In fase di restore dell’applicazione il discorso è analogo, anche se con qualche differenza. Ci penserà infatti il sistema operativo stesso a riattivare la maggior parte delle risorse, come possiamo vedere nel seguente schema.

image

Eccezione fanno le socket, l’oggetto MediaElement e la fotocamera, che devono essere manualmente ricollegati dallo sviluppatore: tipicamente queste operazioni vengono eseguite proprio nell’evento Activated, nel caso in cui l’applicazione venga ripristinata dallo stato Dormant (non è necessario se si proviene dallo stato Tombstoned, dato che questa viene reinizializzata da capo e quindi i vari oggetti vengono istanziati da zero).

Come fare debug dei vari cambiamenti di stato

Abbiamo capito come si comporta un’applicazione Windows Phone in fase di sospensione / attivazione e abbiamo visto come, all’interno della nostra applicazione, possiamo determinare qual è lo stato da cui proviene. Ma come facciamo a testare il comportamento dell’applicazione in entrambi i casi, dato che il passaggio dallo stato Dormant allo stato Tombstoned non avviene in modo deterministico ma al bisogno?

Ci viene in aiuto Visual Studio, introducendo una nuova proprietà nei progetti Windows Phone: se facciamo clic con il tasto destro sul progetto della nostra applicazione e ci spostiamo nella sezione Debug, troveremo la voce Tombstone upon deactivation while debugging. Quando questa opzione è abilitata, le applicazioni che testeremo si comporteranno esattamente come quelle Windows Phone 7.0, ovvero verranno messe in tombstone nel momento in cui vengono sospese. Se invece utilizziamo le opzioni predefinite del progetto, l’applicazione verrà sempre portata in stato Dormant.

image

Un semplice progetto di test

In allegato trovate un semplice progetto che potete usare per testare il Fast App Switching. Come funziona? L’applicazione contiene una TextBox, nel quale inserire un testo a piacere. Se andiamo a vedere il codice, troveremo la classica gestione del tombstone a cui siamo abituati: nell’evento OnNavigatedFrom salviamo in un tombstone il contenuto della casella di testo, nell’evento OnNavigatedTo lo recuperiamo e valorizziamo la proprietà Text della TextBox (ricordandoci però di eliminarla dal dictionary State, dato che l’evento OnNavigatedTo viene scatenato ogni volta che si arriva alla pagina corrente non solo da una sospensione ma anche da un’altra pagina; se non lo facessimo, il valore dal tombstone verrebbe recuperato tutte le volte, anche quando non è necessario). La differenza rispetto ad una applicazione Windows Phone 7.0 è che andiamo ad effettuare questa operazione solo nel caso in cui l’applicazione provenga dallo stato Tombstone: per fare questo, sfruttiamo una variabile booleana (che ho chiamato IsAppStatePreserved) dichiarata nel file App.xaml.cs e che viene valorizzata quando si scatena l’evento Activated.

public bool IsAppStatePreserved { get; set; }

      private void Application_Activated(object sender, ActivatedEventArgs e)
      {
      IsAppStatePreserved = e.IsApplicationInstancePreserved;
      }

Ed ecco invece il codice con cui, nella pagina vera e propria, andiamo a gestire il salvataggio dei dati nel tombstone e il relativo recupero.

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
      {
      bool IsAppStatePreserved = (Application.Current as App).IsAppStatePreserved;
      if (!IsAppStatePreserved && PhoneApplicationService.Current.State.ContainsKey("Text"))
      {
      txtText.Text = PhoneApplicationService.Current.State["Text"].ToString();
      PhoneApplicationService.Current.State.Remove("Text");
      }
      }

      protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
      {
      if (PhoneApplicationService.Current.State.ContainsKey("Text"))
      PhoneApplicationService.Current.State.Remove("Text");

      PhoneApplicationService.Current.State.Add("Text", txtText.Text);
      }

Conclusione

In questo tutorial abbiamo visto che cos’è il Fast App Switching, come funziona e che impatto ha sulle nostre applicazioni: infine abbiamo imparato come gestire gli stati Dormant e Tombstoned e come debuggare le nostre applicazione per simulare entrambi gli stati.

by Il blog di Matteo Pagani on 7/2/2012
Post archive