410 likes | 561 Views
Twitter hashtag: #cztechdays. Twitter hashtag: #cztechdays. Architektura Metro aplikací. Michael Juřek Software Architect Microsoft s.r.o. Twitter hashtag: #cztechdays. Agenda. WinRT Asynchronní volání Životní cyklus aplikace Běh na pozadí Závěrečné úvahy. Desktopov é aplikace.
E N D
Architektura Metro aplikací Michael JuřekSoftware ArchitectMicrosoft s.r.o. Twitter hashtag: #cztechdays
Agenda • WinRT • Asynchronní volání • Životní cyklus aplikace • Běh na pozadí • Závěrečné úvahy
Desktopové aplikace C#/VB kód Windows API Manuálně generovaný interop kód
Příklad kódu [DllImport("avicap32.dll", EntryPoint="capCreateCaptureWindow")]static extern int capCreateCaptureWindow( string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID); [DllImport("avicap32.dll")] static externbool capGetDriverDescription( int wDriverIndex,[MarshalAs(UnmanagedType.LPTStr)] ref string lpszName, int cbName, [MarshalAs(UnmanagedType.LPTStr)] ref string lpszVer, int cbVer); …
Metro aplikace C#/VB/C++/JavaScript kód Windows 8 API Windows Runtime (WinRT)
Příklad kódu using Windows.Media.Capture;var ui = new CameraCaptureUI();ui.PhotoSettings.CroppedAspectRatio = new Size(4, 3);var file = await ui.CaptureFileAsync(CameraCaptureUIMode.Photo);
Architektura WinRT Metro style app Language Projection Windows Metadata & Namespace UI Pickers Controls Media XAML Storage Network … Windows Runtime Core Windows Core
Použití WinRT je snadné • Koncept WinRT a .NET frameworku je velmi podobný • Jeho použití z C#/VB.NET je zcela přirozené • Většina rozdílů mezi .NET a WinRT zůstává skryta • Konverze běžných typů provádí runtime automaticky: • Např. IIterable<T> <-> IEnumerable<T> • U složitějších typů jsou k dispozici extenzní metody: Windows.Storage.Streams.IInputStream inputStream; inputStream = await file.OpenForReadAsync(); System.IO.Stream stream = inputStream.AsStream();
Pravidla pro použití WinRT • WinRT je jediná možnost, jak může aplikace využívat služby operačního systému, nelze ji z Metro aplikací obejít • Operace s dopadem na bezpečnost/soukromí musí být specifikovány v deklaraci aplikace a uživatel je o tom informován • U nejcitlivějších operací musí uživatel specificky odsouhlasit jejich první použití v dané aplikaci (např. kamera)
Vytváření vlastních komponent • Aby šlo komponenty použít i z JavaScriptu a C++ … • … veřejné členy veřejných tříd musí dodržet tato pravidla: • Vstupní a výstupní parametry musí být WinRT typy • Struktury předávané hodnotou mohou mít pouze veřejné členy • Kromě XAML prvků musí být veřejné třídy sealed • Nelze použít vlastní generické typy • Visual Studio má přímo projekt pro tyto komponenty • Třeba změnit cíl kompilace na WinMD • Splnění výše uvedených pravidel kontrolováno při kompilaci
DEMO C# komponenta volaná z JavaScriptu
Agenda • WinRT • Asynchronní volání • Životní cyklus aplikace • Běh na pozadí • Závěrečné úvahy
Asynchronní volání • Získávají rostoucí popularitu, neboť: • Umožňují snáze využít dostupná jádra procesoru • V klientských aplikacích zabraňují „zamrznutí“ aplikace během obsluhy událostí (v Metro aplikacích povinné) • V serverových aplikacích zvyšují škálovatelnost, brání vyčerpání threadů • Asynchronní volání jsou v .NET frameworku od verze 1.0… • … ale jsou neintuitivní a vedou k těžko čitelnému kódu • Async/await v C# a VB.NET nabízí snadná asynchronní volání
Asynchronní metody • Chovají se asynchronně, ale mají jednoduchou „synchronní syntaxi“ • Mají v hlavičce klíčové slovo async • Vrací void anebo Task<T> • Mohou volat jiné asynchronní metody s použitím await • Zbytek těla metody je interně zkonvertován na callback • Jsou prováděny v synchronizačním kontextu volajícího • Pro výpočetně náročné akce vytvořte vlastní Task • Pro složitější situace využijte objekt Task
Asynchronní metoda publicasyncTask<XElement>GetXmlAsync(stringurl) { varclient = newHttpClient(); varresponse = awaitclient.GetAsync(url); vartext = response.Content.ReadAsString(); returnXElement.Parse(text); } publicTask<XElement>GetXmlAsync(stringurl) { vartcs = newTaskCompletionSource<XElement>(); varclient = newHttpClient(); client.GetAsync(url).ContinueWith(task => { varresponse = task.Result; vartext = response.Content.ReadAsString(); tcs.SetResult(XElement.Parse(text)); }); return tcs.Task; }
DEMO Asynchronní metoda
Agenda • WinRT • Asynchronní volání • Životní cyklus aplikace • Běh na pozadí • Závěrečné úvahy
Životní cyklus aplikace App 1 App 2 App N App 3 … Running Po krátké pauzepozastavena Okamžitě pokračuje v běhu Suspended Pokud dochází paměť, je ukončena bez varování Terminated
Suspend • Systémové zdroje jsou plně soustředěny na aplikaci v popředí • Neaktivní aplikace zůstává v paměti, ale jinak šetří baterii: • Žádné CPU, síťová komunikace, práce s diskem • Pozastavení všech vláken – pokud jsou v kritické sekci operačního systému, vyčká se • V události Suspending máte k dispozici max. 5 s času na uložení stavu • Při přepnutí zpět je okamžitě k dispozici • PAST NA VÝVOJÁŘE: Aplikace s připojeným debuggerem není nikdy suspendována
Terminate • Řada situací, kdy může být aplikace ukončena • Nedostatek paměti • Přepnutí na jiného uživatele • Uživatel uzavřel aplikaci • Neošetřená výjimka v aplikaci • Ukončení běhu operačního systému • Aplikace o této akci není informována: • Veškeré uložení stavu je nutné již při obsluze Suspend
Stav aplikace • Doporučené akce: • Během užívání aplikace: průběžně ukládejte stav • Suspending: uložte stav aplikace • Resuming: zpravidla není třeba žádná akce • OnLaunched/OnActivated: načtěte stav aplikace (ošetřete případné výjimky) • Ukládejte pouze stav aplikace, ne data (např. fotky patří jinam) • Využijte třídu SuspensionManager, kód najdete v SDK
DEMO Uložení stavu aplikace
Spuštění aplikace • Mnoho různých způsobů: • Uživatel klikne na ikonu (Launch) • Je využit kontrakt nabízený aplikací (OnActivated) • Vyhledávání v aplikaci (OnSearchActivated) • Sdílení obsahu do aplikace (OnShareTargetActivated) • Otevření souboru asociovaného typu (OnFileActivated) • …. řada dalších, méně častých způsobů
Průběh spuštění • Splash Screen • Konzistentní přechod mezi aplikacemi • Definována v manifestu aplikace • Pokud aplikace do 15 s neukáže okno, je ukončena! • „Falešná splash screen“ je velmi špatné řešení • V aplikaci je zavolána metoda v závislosti na typu spuštení/aktivace a je jí předán potřebný kontext • Např. hledaný řetězec v případě OnSearchActivated()
DEMO Aktivace prostřednictvím kontraktu
Agenda • WinRT • Asynchronní volání • Životní cyklus aplikace • Běh na pozadí • Závěrečné úvahy
Běh aplikace na pozadí • Cože? Před chvílí jsme slyšeli, že je vždy pozastavena… • Slyšeli jste dobře, aplikace sama neběží, ale může: • Využívat push notifikace k aktualizaci svého stavu, dlaždic, notifikacím uživatele apod. – velmi doporučováno!!! • Spouštět audio na pozadí (nedocenitelné ) • Stahovat soubory na pozadí • Ani v jednom případě neběží váš kód, ale systémový kód • Existuje ale ještě jedna možnost…
Background task • Je vysoká pravděpodobnost, že je vaše aplikace nepotřebuje • Princip: • Kód rozdělen na část viditelnou a kód na pozadí • Uživatel spouští viditelnou část kódu • Systém spouští a kontroluje běh kódu na pozadí podle preferencí uživatele • Vhodné scénáře – VoIP, chat, komunikátor, …, reakce na změny stavu systému i uživatele, … • Nevhodné scénáře – cokoliv výpočetně náročného
Použití background task • Příslušnou třídu je nutné deklarovat v manifestu aplikace • Úlohu je třeba registrovat za běhu aplikace: • Při jakých událostech je spuštěna: • Např. uplynutí času, odhlášení, přijetí SMS, (ne)dostupnost Internetu,… • Za jakých podmínek je spuštěna • Např. uživatel nepřítomen, dostupný Internet, … • Pokud aplikace běží, může pomocí událostí sledovat průběh svých běžících úloh na pozadí
Rovnější mezi rovnými… • Lock Screen Apps • Mohou agresivněji využívat CPU i na pozadí • Určeno pro komunikaci v reálném čase • Omezený počet, podléhají potvrzení uživatele • PC Settings -> Personalize
Přísné limity • Aplikace na pozadí jsou velmi omezeny: • Lock Screen Apps – 2 s CPU za 15 minut • Ostatní – 1 s CPU za 2 hodiny • Měří se spotřebované výpočetní cykly • Čekání na asynchronní operace nevadí • Rovněž je omezeno množství síťové komunikace • Těžko kvantifikovat, měřeno modelovanou spotřebou energie • Závisí na typu připojení, šířce pásma, aktuální zátěži, …
Pro jistotu ještě jednou • Pro imitaci běhu na pozadí používejte: • Push notifikace • Živé dlaždice • Úlohy na pozadí jsou pro speciální situace a nejsou v běžných aplikacích typické
DEMO Background task
Agenda • WinRT • Asynchronní volání • Životní cyklus aplikace • Běh na pozadí • Závěrečné úvahy
Přenos znalostí • Pokud vyvíjíte v C#/VB • Všechny jazykové konstrukce • Pokud vyvíjíte pro WPF, Silverlight, Windows Phone 7 • XAML • Data binding • MVVM (Model-View-ViewModel) • Pokud vyvíjíte pro Windows Phone 7 • Životní cyklus aplikace, marketplace, manifest, navigace, …
MVVM • De facto standardní návrhový vzor pro XAML rozhraní Uživatelské rozhraní (XAML) s data bindingem Pokud možno žádný code-behind Připravuje data z Modelu pro data binding ve View Přenáší akce uživatele z View na Model Udržuje stav uživatelské seance (serializace při Suspend) Nezávislý na View (dobře testovatelný) Data a manipulace s nimi View ViewModel Model
Portable library • Novinka ve VS 2012 – knihovny pro více platforem • .NET framework, Silverlight, Metro, Windows Phone • Nabízí možnost sdílení kódu mezi platformami • Portable library smí: • Být referencována z libovolné cílové platformy • Referencovat pouze jinou portable library • Používat pouze třídy dostupné na všech cílových platformách
Příklad sdílení kódu ViewModel View (XAML) View (XAML) Model Konkrétnífunkce platformy Konkrétnífunkce platformy Abstrakceplatformy Platforma B Platforma A
Závěrem • WinRT jako bezpečná abstrakce části operačního systému • Asynchronní volání pro dobrou odezvu aplikace • Životní cyklus aplikace spravován s ohledem na výdrž baterie a okamžitou reakci při probuzení • Pokud znáte C# nebo VB (nebo C++ a JavaScript), máte dobrý základ pro vytváření Metro aplikací: • Znalost XAML (WPF, Silverlight, WP7) výhodou • Znalost vývoje na Windows Phone 7 super výhodou