Le applicazioni Windows Phone 7 vengono eseguite nella propria sandbox e non hanno accesso diretto alle funzionalità del telefono come ad esempio: l’elenco dei contatti, l’invio degli SMS oppure l’invio di una semplice telefonata.
Per far questo bisogna utilizzare delle opportune API definite nella documentazione col nome di Launchers e Choosers, già dal nome dovreste intuire che queste sono a tutti gli effetti delle applicazioni built-in (non a caso le relative classi stanno in Microsoft.Phone.Task) le quali si differenziano dal fatto che i Choosers, a differenza dei Launchers, possono ritornare delle informazioni all’applicazione chiamante.
Nella documentazione MSDN trovate l’elenco dei Launchers e Choosers disponibili, quello che però bisogna tenere in considerazione quando si utilizzando queste funzionalità  sono due aspetti fondamentali:

  • Essendo Launchers e Choosers delle applicazioni, quando lanciate, queste “spengono” (o meglio mandano in Tombstoning") l’applicazione chiamante, ovvero la nostra.
    Se volete saperne di più andate qui
  • In caso di Choosers se volete, come presumo, gestire le informazioni ritornate all’applicazione il codice va scritto in un determinato modo.

Vediamo un caso banale di utilizzo di un Launcher: per capire cosa succede ho inserito il seguente codice in App.xaml.cs:

private void Application_Activated(object sender, ActivatedEventArgs e)
{
Debug.WriteLine("Activated");
}

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
Debug.WriteLine("Deactivated");
}

e all’interno dell’evento Click di un pulsante ho scritto:

private void button1_Click(object sender, RoutedEventArgs e)
{
SearchTask searchTask = new SearchTask { SearchQuery = "Windows Phone 7" };
searchTask.Show();
Debug.WriteLine("Completed");
}

Lanciando il progetto e premendo il pulsante ecco quello che appare nell’emulatore:

image

Ma sopratutto, questo è quello che viene tracciato nella Output window:

image 

Questo dovrebbe già farvi capire che eseguire del codice dopo che un Launcher è stato completato non è poi così banale, tenendo presente che, come già ciatato nei posts precedenti, la nostra applicazione potrebbe anche non essere più ripristinata.

Vediamo ora un semplice caso di Chooser: La documentazione indica che, se vogliamo che il meccanismo di ripristino post-tombstoning sia in grado di invocare correttamente l’evento Completed di un Chooser è necessario che:

  • L’istanza del Chooser sia definita a livello di ApplicationPage.
  • La sottoscrizione dell’evento avvenga nel costruttore della pagina stessa.

in pratica qualcosa tipo:

public partial class MainPage : PhoneApplicationPage
{
PhoneNumberChooserTask task = new PhoneNumberChooserTask();

public MainPage()
{
InitializeComponent();
task.Completed += new EventHandler<PhoneNumberResult>(task_Completed);
}

private void button2_Click(object sender, RoutedEventArgs e)
{
task.Show();
}

private void task_Completed(object sender, PhoneNumberResult e)
{
if (e.Error == null) MessageBox.Show(e.PhoneNumber);
}
}
Così facendo, se avete dei numeri memorizzati nel device/emulatore (se non li avete potete aggiungerli usando il SavePhoneNumberTask) avrete la possibilità di selezionarne uno e, premuto F5 quando dopo la selezione lo schermo dell’emulatore diventa nero, vedrete eseguire il codice all’interno del gestore task_Completed.
 
Nulla di spaventosamente complicato, anzi, ma sicuramente l’intervento del Tombstoning implica,anche in questo caso, una certa attenzione in caso di utilizzo di queste API nei nostri programmi Windows Phone.