Choosers

Udostępnij na: Facebook

Autor: Marcin Kruszyński

Opublikowano: 2011-01-07

Każda aplikacja w Windows Phone 7 jest izolowana zarówno pod względem wykonania, jak i dostępu do systemu plików. Z funkcjonalności telefonu możemy skorzystać pośrednio za pomocą API w postaci launcherów i chooserów.

Launcher jest akcją typu „wykonaj i zapomnij”, która wykonuje takie zadania jak: wysłanie SMS-a, otwarcie przeglądarki, nawiązanie rozmowy. Launchery zostały dokładnie opisane w artykule Launchers.

Chooser pełni rolę okna dialogowego, w którym wybieramy pewne dane z zasobów telefonu, np. e-mail, numer telefonu, obrazek, i przekazujemy je do aplikacji.

Po zapoznaniu się z informacjami zawartymi w tym artykule będziesz:

  • rozumiał, jak wywołanie choosera wpływa na Cykl życia aplikacji,
  • znał dostępne choosery,
  • wiedział, w jaki sposób należy ich używać,
  • wiedział, jak są wspierane przez emulator.

Wprowadzenie

Launchery i choosery wywołują w swojej implementacji wbudowane aplikacje. Powoduje to dezaktywację aktualnie wykonującej się aplikacji. Bardzo często wiąże się to z zatrzymaniem jej procesu. System operacyjny przechowuje wtedy infomacje o jej stanie, stosując procedurę tzw. tombstoningu. Te dane są przydatne przy odtwarzaniu stanu aplikacji podczas jej reaktywacji, która następuje m.in po powrocie z launchera lub choosera. Dzięki temu możemy sprawić, że użytkownik nie będzie świadomy faktu przełączania między aplikacjami. Więcej informacji nt. poruszonych tutaj zagadnień znajdziesz w artykule Cykl życia aplikacji.

Zwracane przez choosery dane są przekazywane do reaktywowanej aplikacji. Aby dobrze to funkcjonowało, należy w odpowiednim miejscu tworzyć obiekt choosera i dokonywać obsługi zwracanych przez niego danych. Trzeba tutaj zaznaczyć, że nie mamy nigdy gwarancji powrotu do naszej aplikacji i otrzymania danych od choosera. Użytkownik po uruchomieniu wbudowanej aplikacji może za pomocą przycisku Start przejść do dowolnej innej aplikacji w systemie.

Przy korzystaniu z launcherów i chooserów należy pamiętać, że występują pewne różnice w ich działaniu na emulatorze i na fizycznym urządzeniu. 

Dostępne choosery

Wśród chooserów możemy wyróżnić:

  • CameraCaptureTask – uruchamia aplikację kamery, zwraca strumień ze zdjęciem zrobionym przez użytkownika.
  • EmailAddressChooserTask – uruchamia aplikację zarządzającą kontaktami, zwraca e-mail z wybranego przez użytkownika kontaktu.
  • PhoneNumberChooserTask – uruchamia aplikację zarządzającą kontaktami, zwraca numer telefonu z wybranego przez użytkownika kontaktu.
  • PhotoChooserTask – uruchamia przeglądarkę obrazków, zwraca strumień ze zdjęciem wybranym przez użytkownika.
  • SaveEmailAddressTask – zapisuje podany e-mail w kontaktach, nie zwraca żadnych danych, ale pozwala obsłużyć moment zakończenia operacji.
  • SavePhoneNumberTask – zapisuje podany numer telefonu w kontaktach, nie zwraca żadnych danych, ale pozwala obsłużyć moment zakończenia operacji.

Część chooserów nie powoduje tombstoningu, jeśli wywołana aplikacja ma odpowiednią ilość zasobów systemowych. Są to: PhotoChooserTask, CameraCaptureTask,  EmailAddressChooserTask, PhoneNumberChooserTask. Proces aplikacji wywołującej zostaje tylko uśpiony, nie jest kończony, co zostało podyktowane chęcią zapewnienia lepszej płynności w działaniu interfejsu użytkownika.

Wszystkie choosery, z wyjątkiem CameraCaptureTask, działają tak samo na emulatorze i fizycznym telefonie. Bez wykonywania żadnych dodatkowych czynności na emulatorze dysponujemy przykładowymi kontaktami. Mamy zapewniony także dostęp do przykładowych zdjęć dostarczanych wraz z WP7. Emulator nie obsługuje kamery, możemy jednak zrobić za jego pomocą zdjęcie w postaci przykładowego obrazka, który zostanie przekazany do naszej aplikacji.

Implementacja

Ze wszystkich chooserów korzystamy w podobny sposób. Działają one w sposób asynchroniczny. Przed wywołaniem na nich metody Show, zapisujemy się na zdarzenie Completed. W jego handlerze obrabiamy zwracane dane.

Omówimy to na przykładzie PhotoChooserTask (korzystanie ze wszystkich rodzajów chooserów zostało pokazane w dokumentacji na stronie How to: Use Choosers for Windows Phone). Załóżmy, że chcemy wstawić do naszej aplikacji zdjęcie z telefonu. Cały proces został przedstawiony na rys. 1.

**Rys.1. Wstawianie zdjęcia z telefonu.

Wykonujemy następujące czynności:

  • Definiujemy zmienną w globalnej przestrzeni strony PhoneApplicationPage:

       PhotoChooserTask photoChooserTask;

  • W konstruktorze strony PhoneApplicationPage tworzymy nową instancję choosera i definiujemy delegat dla jego zdarzenia Completed:

    public ChoosePhotosContacts()
      {
          InitializeComponent();
          photoChooserTask = new PhotoChooserTask();
          photoChooserTask.Completed +=
                  new EventHandler<PhotoResult>(photoChooserTask_Completed);
      }
    
  • Implementujemy handler dla zdarzenia Completed (w tym przypadku zwrócone w strumieniu zdjęcie ustawiamy jako źródło kontrolki typu Image):

    void photoChooserTask_Completed(object sender, PhotoResult e)
      {
          if (e.TaskResult == TaskResult.OK && e.ChosenPhoto != null)
          {
              var photoStream = e.ChosenPhoto;
              var bitmapImage = new BitmapImage();
              bitmapImage.SetSource(photoStream);
              this.image.Source = bitmapImage;
          }
      }
    

    Argumenty zdarzenia dla wszystkich chooserów dziedziczą po klasie TaskEventArgs. Dzięki niej oprócz danych typowych dla danego choosera dostajemy informacje o zaistniałych błędach (propercja Error) oraz o wyniku wykonania (propercja TaskResult).

  • Na chooserze wywołujemy metodę Show (np. przy naciśnięciu na przycisk):

    private void choosePhotoButton\_Click(object sender, RoutedEventArgs e)  
           {  
               photoChooserTask.Show();  
           }
    

Zwróćmy uwagę na sposób, w jaki użyliśmy choosera.  Chcemy mieć pewność, że reaktywowana aplikacja otrzyma zwracany przez niego wynik. Definiujemy więc jego zmienną  w przestrzeni strony PhoneApplicationPage, a w jej konstruktorze budujemy obiekt choosera i przypinamy delegat do jego zdarzenia Completed.

Podsumowanie

W tym artykule poznaliśmy zagadnienia związane z obsługą chooserów. Wiemy, jaką pełnią rolę, z jakich funkcjonalności telefonu możemy za ich pomocą skorzystać. Znamy też wsparcie chooserów  na emulatorze. Rozumiemy, jak wywołanie choosera wpływa na cykl życiowy aplikacji. Nauczyliśmy się pisać kod w taki sposób, aby przekazywanie danych działało prawidłowo.


          

[]

Marcin Kruszyński

Absolwent wydziału EAIE Akademii Górniczo-Hutniczej w Krakowie na kierunku Informatyka. Technologiami Microsoft zajmuje się od sześciu lat. Pracuje w firmie ComArch, gdzie tworzy rozwiązania oparte na platformie .NET i Silverlight. Od dwóch lat jest architektem w centrum badawczo-rozwojowym. Wcześniej zajmował się utrzymaniem oraz rozwojem aplikacji webowych w systemie EDI dla dużych sieci handlowych. Interesuje się wieloma aspektami platformy .NET od pierwszej wersji. Obecnie specjalizuje się w implementacji bogatych interfejsów graficznych aplikacji w oparciu o Silverlight (desktop i mobilne) i WPF, których rozwój śledzi od początku ich istnienia. Sporo uwagi poświęca też platformie WCF RIA Services. Jest pasjonatem nowych trendów i technologii (zwłaszcza w wydaniach CTP i beta), których poznawaniem zajmuje się hobbystycznie i zawodowo. Prelegent grup społecznościowych. Prowadził warsztaty z Silverlight w Krakowie (KGD.NET) i Wrocławiu (PGS). Prezentował tworzenie aplikacji w Silverlight na Windows Phone 7 na Visual Studio 2010 Community Launch we Wrocławiu i Krakowie. Pełnił funkcję eksperta w strefie Ask The Expert (ATE) technologii Windows Phone na konferencji Microsoft Technology Summit (MTS) 2010.

Blogi: http://www.marcinkruszynski.blogspot.com, http://www.martinkruszynski.blogspot.com