Choosers
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