5. díl - Programujeme pro Windows 8 - Zachování stavu aplikace

C# .NET Windows Store Aplikace Programujeme pro Windows 8 - Zachování stavu aplikace

Vítejte u 5.dílu seriálu Programujeme pro Windows 8. V minulém díle jsme si ukázali jednoduchou navigaci mezi stránkami. Dnes se pustíme do obsluhy stavu aplikace a zkusíme si ukládat nějaká data.

Na konci minulého dílu jsme si ukázali jednu neplechu. Při navigaci na jinou stránku a zpět nám zmizí veškerá data ze stránky. Daty myslím vyplněné textboxy,dále to mohou být vybrané položky v Listboxu apod. Proč se to děje ?

Navigace a její neplechy

Možná to můžeme nazvat neplechou, já bych to nazval spíše výhodou. Každá stránka se při zobrazení zakládá zcela znovu, proto nám mizí vyplněné položky apod. Při založení stránky se vždy volá metoda LoadState, kterou má každá stránka. Naopak při opuštění stránky se volá metoda SaveState. A v čem že je ta výhoda? Aplikace nám zabírá méně paměti. Sice v našem případě nám to zabírá málo místa i kdybychom měli 100 stránek s jedním textboxem, ale zkuste si představit stránku s 1000 daty a potom přesně 1000 stránek s podrobným popisem dat.

Jelikož jsme v prostředí Modern UI ve Windows 8, nemůžeme argumentovat, že "Dnešní PC mají obrovský výkon, není tohle potřeba řešit." Odpověď zní "Musíme!". Nezapomínejme na různé tablety, které mají mnohonásobně nižší výkon. A tablety s procesory ARM už vůbec. Sice můžeme aplikaci vytvořit pouze pro určitý druh procesorů a na Windows Store stejně aplikaci nabídnout, tj. vypnout podporu pro ARM, ale to předbíhám. Jednou si o tom povíme víc.

Jak tedy řešit ukládání rozepsaných textboxů? Pojďme se na to podívat.

Obsluha stavů aplikace

Jak jsme si řekli v prvním díle aplikace přecházejí do různých stavů. Aplikace mohou přejít do spánku (suspend režim) nebo můžou být zcela vypnuty (terminate). Pokud byla aplikace v suspend režimu, je vhodné, aby se při probuzení zobrazila ve stavu, v jakém ji uživatel opustil. Dnes si toto ukážeme. Než se pustíme do samotného ukládání, pojďme si vlastně říct, jakým způsobem můžeme ukládat data. Windows 8, resp. WinRT nám nabízí několik možností, jak uložit data aplikací. Můžeme je ukládat pouze pro aktuální použití (lze to přirovnat k session v PHP) nebo ukládat na disk uživatele. Ovšem pozor! V prvním díle jsme si neřekli uzavřenost systému. Aplikace pro Modern UI (Metro) nemohou ukládat, kam se jim zachce. Mají pouze speciálně určené místo, které lze přirovnat k Appdata. Celý systém je stejný jako na Windows Phone. Představte si bublinu okolo aplikace. Do této bubliny můžeme data ukládat, mimo bublinu ne.

Uložení stavu aplikace

Máme tedy dvě hlavní možnosti uložení dat a to Appdata pro trvalé uložení a Session pro aktuální uložení, tedy po vypnutí aplikace data ze Session zmizí. My si zkusíme uložit data oběma způsoby. Z textboxu jméno (txName) si uložíme text natrvalo. Z druhého texboxu uložíme text pouze jako session.

Možnosti Appdata ukládání

  • Local settings - lokální nastavení aplikace (klíč <-> hodnota)
  • Local Folder - lokální složka pro soubory aplikace (libovolné soubory)
  • Roaming settings - roaming nastavení aplikace (klíč <-> hodnota)
  • Roaming Folder - roaming složka pro soubory aplikace (libovolné soubory)
  • Temporary folder - temp aplikace

Roaming je speciální složkou/nastavením, které se samo synchronizuje přes SkyDrive. Tímto způsobem zajistíme pohodlné přesunutí dat z jednoho zařízení do druhého. Příkladem může být úkolníček. Napíšete si úkolníček na tabletu a na stolním počítači si je přečtete. Jednoduché, že? :-)

Použití Session (pageState)

Než se pustíme do uložení, trochu si srovnáme termín Sessions. Ačkoliv jsem napsal, že se dá přirovnat k sessions v PHP, není tomu tak. Sessions zde máme představováno slovníky Dictionary<Strin­g,Object>. Každá stránka má vlastní slovník. Tímto můžeme snadno uložit a načítat data každé stránky zvlášť. Předávání data mezi stránkami můžeme udělat přes Navigaci anebo samozřejmě využít různých návrhových vzorů (Singleton,...). Konec povídání jdeme na věc. Máme dvě řešení, jak data uložit. Prvním řešením je zapnutí cachování aplikace stránek. Není to žádná věda. Následující kód dejte do konstruktoru stránky,kde chcete zapnout Cache.

this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;

Nyní se všechny vyplněné textboxy, vybrané položky apod. uloží a při znovuotevření se nám zobrazí ve stavu, v jakém jsme je nechali. Tento způsob my nevyužijeme a ne vždy se používá. Cachování stránek vlastně využívá také Session. My si ukážeme vlastní práci s ukládáním.

Každá stránka obsahuje dvě metody LoadState a SaveState. Co metody dělají je víc než jasné. První načítá data, druhá ukládá :). Zrychlíme trochu tempo a časem si následující řádky vysvětlíme podrobněji. Přesuňte se na App.xaml.cs. Metody OnLaunched a OnSuspending označte jako asynchronní, slovíčko async. Bude to vypadat tedy ve stylu

protected async override void OnLaunched(LaunchActivatedEventArgs args)

V metodě OnLaunched v podmínce if(rootframe==nu­ll) přidejte pod založení Frame následující řádek. Zajistí nám zaregistrování hlavní stránky pro SuspensionManager, který nám zajišťuje ukládání. Podobně musíme registrovat i další stránky.

SuspensionManager.RegisterFrame(rootFrame, "mainPage");

Do podmínky if (args.Previou­sExecutionSta­te == ApplicationExe­cutionState.Ter­minated) přidejte zavolání RestoreAsync(), zajistí zavolání LoadState na všech registrovaných Framech. Bystřejší z vás pochopili, že jej voláme tehdy, kdy se aplikace zcela zapnula. Slovíčko await nám zajistí oddělené vlákno.

await SuspensionManager.RestoreAsync();

V metodě OnSuspending přidejte hned pod první řádek. Tím jsme zajistili zavolání metody SaveState() na všech zaregistrovaných Framech.

await SuspensionManager.SaveAsync();

Přesuňte se do MainPage.xaml.cs. V metodě SaveState si uložíme do LocalSettings jméno a do session vypsaný věk. Sessions je zde představováno slovníkem (klíč <-> hodnota) nazvaném pageState.

// Appdata - stálá data - nastavení aplikace
ApplicationDataContainer localSet =  ApplicationData.Current.LocalSettings;
localSet.Values["name"] = txName.Text;
// session data - akutální data - po terminate stavu data zmizí
pageState["vek"] = txVek.Text;

Do složky LocalSettings jsme si uložili hodnotu textboxu txJmeno a to pouze text. Do sessions (pageState) jsme si uložili věk a opět pouze text. Není potřeba ukládat celý objekt TextBox. Pojďme ještě data načíst a máme hotovo. Následující řádky vložte do metody LoadState().

//načte session
//Podmínka - pagestate nesmí být null a obsahuje klíč "vek" ?
if (pageState != null && pageState.ContainsKey("vek"))
{
             txVek.Text = pageState["vek"].ToString(); //načteme věk z pagestate a uložíme do textu textboxu txVek
 }

//app data - localsetting - nastavení aplikace
ApplicationDataContainer localSet = ApplicationData.Current.LocalSettings;

//Podmínka -  obsahuje klíč "name" ?
if(localSet.Values.ContainsKey("name"))
{
        txName.Text = localSet.Values["name"].ToString(); // načteme klíč
}
Funkční ukládání

Funkční ukládání

A máme hotovo. Zkuste vyplnit textboxy a přejít na druhou stránku. Vraťte se zpět a vidíte, že máme oba textboxy vyplněné. Aplikaci vypněte a zkuste ji zpět zapnout. Pozor, pokud aplikaci spouštíte přes Debug režim, nechte až se Visual Studio přepne zpět do "normálního stavu", tedy vypne se Debug. Bude to trvat právě 10 sekund, aneb Suspend režim v praxi :). Pokud ukončíte debug přes Stop Debuging, není zaručené že se Suspend a veškeré uložení povede. Mluvím z vlastní zkušenosti. Samozřejmě toto platí pouze pro Debug režim. Při normální běhu aplikace, uživatel ani nepozná, že aplikace ještě 10 sekund běží.

Opět jsme u konce. Příště se podíváme podrobněji na ukládání do Appdata. Zkusíme si udělat aplikaci na jednoduchou správu uživatelů, která bude umět ukládat a načítat data. Není to žádná věda, jenom si ukážeme potřebné třídy :).

Pokud se vám dnešní díl líbil budu velmi rád za zpětnou vazbu. Pokud máte nějaké dotazy určitě se nebojte zeptat. Vždy se pokusím poradit. Jako vždy je přiložen zdrojový kód aplikace.

U dalšího dílu se na vás těším!


 

Stáhnout

Staženo 219x (283.92 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal Petr Nymsa
Avatar
Autor se věnuje programování v C# a celkově se zajímá o .NET technologie. Působí jako Microsoft Student Partner.

Jak se ti líbí článek?
Celkem (1 hlasů) :
55555


 



 

 

Komentáře

Avatar
fidko.tomas
Člen
Avatar
fidko.tomas:

Vdaka za clanok, tesim sa na dalsi :)

 
Odpovědět 18.6.2013 8:37
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na fidko.tomas
Petr Nymsa:

Díky za ohlas. Brzy se objeví další díl, minimálně jeden :)

Odpovědět 18.6.2013 12:37
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
jura
Neregistrovaný
Avatar
Odpovídá na Petr Nymsa
jura:

mas to super este by to chcelo ukladanie a sifrovanie udajov ,

 
Odpovědět 22.6.2013 1:01
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.