Wraz z pojawieniem się nowej wersji Windows Phone – Mango zmienił się model zarządzania programami. Do tej pory istniały tylko cztery stany w których mogła znajdować się aplikacja. W momencie ponownego uruchamiania aplikacji programiści musieli za każdym razem zadbać, aby wszystkie dane zostały ponownie wczytane. Miało to na celu zapewnienie dużej wydajności telefonu oraz jego długiego czasu działania. Idea była i nadal jest bardzo słuszna, ale została lekko zmodyfikowana.
Podstawowym problemem tej idei było niedopasowanie do rzeczywistości. Nasuwa się pytanie, czy rzeczywiście użytkownik korzysta tylko z jednej aplikacji. Jeśli zastanowimy się jak wygląda korzystanie z komórki to okazuje się, że bardzo często korzysta się z kilku aplikacji naprzemiennie. Z tego powodu w Mango wprowadzono następujące rozwiązanie – dodano dodatkowy stan Dormant.
Źródło: Execution Model Overview for Windows Phone
Jest to stan pośredni pomiędzy stanem Running i Tombstoned. W tym stanie wszystkie wątki są wstrzymane i nie następuje żadne przetwarzanie. Aplikacja natomiast pozostaje w pamięci, przez co po ponownym jej uruchomieniu nie musi już przywracać swojego stanu. Dzięki takiemu zabiegowi następuje dużo szybsze przywrócenie działającej aplikacji.
O tym kiedy aplikacja przejdzie ze stanu Dormant do stanu Tombstoned decyduje system. Zależy to oczywiście od zapotrzebowania na pamięć. Mankamentem tego rozwiązania jest fakt, że nie mamy możliwości obsługi tego przejścia. Co więcej nie dostajemy żadnego zdarzenia, które informowałoby nas o tym. Powoduje to pewną nadmiarowość ponieważ za każdym razem, gdy użytkownik opuszcza aplikację należy zapisać dane. Rozsądnie byłoby udostępnić zdarzenie informujące o tym, że aplikacji przechodzi ze stanu Dormant do stanu Tombstoned. Z drugiej natomiast strony można traktować to rozwiązanie jako racjonalne ponieważ jeśli potrzebujemy przenieść aplikację do stanu Tombstoned to wystarczy tylko zwolnić pamięć. Nie trzeba uruchamiać aplikacji, aby zapisać potrzebne dane.
Powrót aplikacji ze stanów Dormant i Tombstoned sygnalizowany jest tym samym zdarzeniem – Activated. W celu poprawnej obsługi mechanizmu Fast Application Switching – FAS – należy sprawdzić z jakiego stanu jest przywracana aplikacja. W tym celu należy skorzystać z parametru IsApplicationInstancePreserved, który można uzyskać z argumentów przekazywanych przy wywołaniu zdarzenia Activate. Poniżej przedstawiam kod implementujący mechanizm FAS.
private void Application_Activated(object sender, ActivatedEventArgs e) { if (!e.IsApplicationInstancePreserved ) { // restore application state } }
Jak widać implementacja tego rozwiązania jest bardzo prosta i nie powinna przysporzyć nikomu problemów.
Zostaw komentarz