Twitter hashtag: #cztechdays
description
Transcript of Twitter hashtag: #cztechdays
OREA Hotel Voroněž IBrno
5. – 6. 3. 2012
Twitter hashtag: #cztechdays
Top Hotel Praha
7. – 8. 3. 2012
Twitter hashtag: #cztechdays
Michael JuřekSoftware ArchitectMicrosoft s.r.o.
Architektura Metro aplikací
Twitter hashtag: #cztechdays
WinRTAsynchronní voláníŽivotní cyklus aplikaceBěh na pozadíZávěrečné úvahy
Agenda
Desktopové aplikace
C#/VB kód Windows API
Manuálně generovaný interop kód
[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 extern bool capGetDriverDescription( int wDriverIndex, [MarshalAs(UnmanagedType.LPTStr)] ref string lpszName, int cbName, [MarshalAs(UnmanagedType.LPTStr)] ref string lpszVer, int cbVer);
…
Příklad kódu
Metro aplikace
C#/VB/C++/JavaScript kód Windows 8 API
Windows Runtime (WinRT)
using Windows.Media.Capture;
var ui = new CameraCaptureUI();ui.PhotoSettings.CroppedAspectRatio = new Size(4, 3);
var file = await ui.CaptureFileAsync(CameraCaptureUIMode.Photo);
Příklad kódu
Architektura WinRTMetro style app
Language Projection
Windows Metadata & Namespace
Windows Core
Windows Runtime Core
UI Pickers Controls Media
XAML Storage Network …
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á skrytaKonverze 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();
Použití WinRT je snadné
WinRT je jediná možnost, jak může aplikace využívat služby operačního systému, nelze ji z Metro aplikací obejítOperace s dopadem na bezpečnost/soukromí musí být specifikovány v deklaraci aplikace a uživatel je o tom informovánU nejcitlivějších operací musí uživatel specificky odsouhlasit jejich první použití v dané aplikaci (např. kamera)
Pravidla pro použití WinRT
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
Vytváření vlastních komponent
DEMOC# komponenta volaná z JavaScriptu
WinRTAsynchronní voláníŽivotní cyklus aplikaceBěh na pozadíZávěrečné úvahy
Agenda
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í volání
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
callbackJsou 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í metody
public async Task<XElement> GetXmlAsync(string url) { var client = new HttpClient(); var response = await client.GetAsync(url); var text = response.Content.ReadAsString(); return XElement.Parse(text);}
Asynchronní metoda
public Task<XElement> GetXmlAsync(string url) { var tcs = new TaskCompletionSource<XElement>(); var client = new HttpClient(); client.GetAsync(url).ContinueWith(task => { var response = task.Result; var text = response.Content.ReadAsString(); tcs.SetResult(XElement.Parse(text)); }); return tcs.Task;}
DEMOAsynchronní metoda
WinRTAsynchronní voláníŽivotní cyklus aplikaceBěh na pozadíZávěrečné úvahy
Agenda
Životní cyklus aplikace
Running
Terminated
…
SuspendedPokud dochází paměť, je ukončena bez varování
App 1 App 2 App 3 App N
Po krátké pauzepozastavena
Okamžitěpokračuje v běhu
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í stavuPři přepnutí zpět je okamžitě k dispoziciPAST NA VÝVOJÁŘE: Aplikace s připojeným debuggerem není nikdy suspendována
Suspend
Ř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
Terminate
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
Stav aplikace
DEMOUložení stavu 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ů
Spuštění aplikace
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()
Průběh spuštění
DEMOAktivace prostřednictvím kontraktu
WinRTAsynchronní voláníŽivotní cyklus aplikaceBěh na pozadíZávěrečné úvahy
Agenda
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ódExistuje ale ještě jedna možnost…
Běh aplikace na pozadí
Je vysoká pravděpodobnost, že je vaše aplikace nepotřebujePrincip: 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živateleVhodné 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
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í
Použití background task
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
Rovnější mezi rovnými…
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, …
Přísné limity
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é
Pro jistotu ještě jednou
DEMOBackground task
WinRTAsynchronní voláníŽivotní cyklus aplikaceBěh na pozadíZávěrečné úvahy
Agenda
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, …
Přenos znalostí
De facto standardní návrhový vzor pro XAML rozhraní
MVVM
ViewModel
View
Model
Uživatelské rozhraní (XAML) s data bindingemPokud možno žádný code-behind
Připravuje data z Modelu pro data binding ve ViewPřenáší akce uživatele z View na ModelUdržuje stav uživatelské seance (serializace při Suspend)Nezávislý na View (dobře testovatelný)
Data a manipulace s nimi
Novinka ve VS 2012 – knihovny pro více platforem .NET framework, Silverlight, Metro, Windows
PhoneNabízí možnost sdílení kódu mezi platformamiPortable 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
Portable library
Příklad sdílení kódu
Platforma A Platforma B
View (XAML)
Konkrétnífunkce platformy
View (XAML)
Konkrétnífunkce platformy
ViewModel
Model
Abstrakceplatformy
WinRT jako bezpečná abstrakce části operačního systémuAsynchronní 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
Závěrem