Programowanie .NET

Archive for the tag “Suspended”

Suspended

Dzisiaj opiszę czym jest suspended. Pod tym tajemniczym wyrazem kryje się stan aplikacji która nie jest na pierwszym planie czyli użytkownik aktualnie z niej nie korzysta. Podobny stan posiadają aplikacje pisane na smartfony z Windows Phone 7. Po co wspominam o tym stanie? Ponieważ gdy aplikacja znajduje się w stanie zamrożenia (suspended) może nastąpić sytuacja, że system bez pytania zamknie aplikację a użytkownik gdy będzie chciał powrócić do niej z powrotem zdziwi się, że uruchamia się na nowo. Microsoft wprowadził ten stan aby lepiej kontrolować zasoby komputera. Ponieważ gdy aplikacja znajduje się w stanie suspended nie korzysta z żadnych zasobów jak np.: CPU, karta graficzna, kata sieciowa itd.. Korzysta jedynie z pamięci RAM. Natomiast aktualnie działająca aplikacja moze potrzebować więcej pamięci RAM i w tedy system przydzieli jej pamięć zajmowaną przez aplikacje w stanie zamrożenia.

W tym poście pokażę w jakich miejscach należy umieszczać kod aby móc reagować na takie sytuacje. Oczywiście sama reakcja będzie wyglądała inaczej w każdej aplikacji jednak miejsca osadzenia kodu są te same. W moim przypadku będę zapamiętywał stronę na której aktualnie znajduje się użytkownik.

Przed przystąpieniem do pracy warto zapoznać się jak aplikacja reaguje na sytuację  zamrożona i gwałtownego zakończenia. W tym celu wystarczy uruchomić spod Visual Studio aplikację w trybie debug. Po uruchomieniu wracamy do Visual Studio i naciskamy przycisk.

image

Jeśli go nie widzimy to trzeba dodać pasek o nazwie Debug Location.

Po tym jak umiemy już wywołać interesującą nas sytuację nadszedł czas na zapoznanie się gdzie możemy przechowywać informacje tak aby ich nie utracić. Platforma Windows Runtime daje nam dostęp do Windows.Storage.ApplicationData. Jest to klasa która umożliwia przechowywanie danych w następujący sposób:

  • Lokalny folder (LocalFoldet)
  • Lokalne ustawienia (LocatSettings)
  • Zdalny folder (RoamingFolder)
  • Zdalne ustawienia (RoamingSettings)
  • Folder czasowy (TemporaryFolder)

W przypadku zapisu danych na nośnikach zdalnych (przez Internet) Aplikacja może przywracać swój stan pomiędzy urządzeniami. Dodatkowo jeśli użytkownik nie jest zalogowany na koncie Live lub nie ma podłączenia do Internetu system przechowuje dane lokalnie. Aktualnie jest tylko jeden minus w wersji Windows Consumer Preview można przechowywać jedynie 100K danych.

Przejdźmy więc do kodu. W konstruktorze klasy App zobaczycie że jest już dodana obsługa zdarzenia Suspending tak więc w tej metodzie następuje dodanie kodu odpowiedzialnego za zapisanie stanu. W moim przypadku wygląda tak.

ApplicationData.Current.RoamingSettings.Values["Location"] = _location;

Zmienna _location przechowuje aktualną stronę i jest to zapisywane jako zdalne ustawienie. Ustawienia to para klucz/wartość. Tutaj klucz to: “Location” natomiast wartością jest to co przechowuje zmienna _location.

Ostatnim krokiem jest przywrócenie odpowiedniego stanu w przypadku zamrożenia i zamknięcia aplikacji. Dokonujemy tego w metodzie OnLaunched() poprzez dodanie jednego warunku if.

if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
    //TODO: Kod do przywrócenia stanu. U mnie taki
    var location = (string)ApplicationData.Current.RoamingSettings.Values["Location"];
    NavigateToLocation(location);

}

Post Navigation