Twitter hashtag: #cztechdays

41
OREA Hotel Voroněž I Brno 5. – 6. 3. 2012 Twitter hashtag: #cztechda

description

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. - PowerPoint PPT Presentation

Transcript of Twitter hashtag: #cztechdays

Page 1: Twitter hashtag: #cztechdays

OREA Hotel Voroněž IBrno

5. – 6. 3. 2012

Twitter hashtag: #cztechdays

Page 2: Twitter hashtag: #cztechdays

Top Hotel Praha

7. – 8. 3. 2012

Twitter hashtag: #cztechdays

Page 3: Twitter hashtag: #cztechdays

Michael JuřekSoftware ArchitectMicrosoft s.r.o.

Architektura Metro aplikací

Twitter hashtag: #cztechdays

Page 4: Twitter hashtag: #cztechdays

WinRTAsynchronní voláníŽivotní cyklus aplikaceBěh na pozadíZávěrečné úvahy

Agenda

Page 5: Twitter hashtag: #cztechdays

Desktopové aplikace

C#/VB kód Windows API

Manuálně generovaný interop kód

Page 6: Twitter hashtag: #cztechdays

[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

Page 7: Twitter hashtag: #cztechdays

Metro aplikace

C#/VB/C++/JavaScript kód Windows 8 API

Windows Runtime (WinRT)

Page 8: Twitter hashtag: #cztechdays

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

Page 9: Twitter hashtag: #cztechdays

Architektura WinRTMetro style app

Language Projection

Windows Metadata & Namespace

Windows Core

Windows Runtime Core

UI Pickers Controls Media

XAML Storage Network …

Page 10: Twitter hashtag: #cztechdays

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é

Page 11: Twitter hashtag: #cztechdays

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

Page 12: Twitter hashtag: #cztechdays

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

Page 13: Twitter hashtag: #cztechdays

DEMOC# komponenta volaná z JavaScriptu

Page 14: Twitter hashtag: #cztechdays

WinRTAsynchronní voláníŽivotní cyklus aplikaceBěh na pozadíZávěrečné úvahy

Agenda

Page 15: Twitter hashtag: #cztechdays

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í

Page 16: Twitter hashtag: #cztechdays

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

Page 17: Twitter hashtag: #cztechdays

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;}

Page 18: Twitter hashtag: #cztechdays

DEMOAsynchronní metoda

Page 19: Twitter hashtag: #cztechdays

WinRTAsynchronní voláníŽivotní cyklus aplikaceBěh na pozadíZávěrečné úvahy

Agenda

Page 20: Twitter hashtag: #cztechdays

Ž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

Page 21: Twitter hashtag: #cztechdays

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

Page 22: Twitter hashtag: #cztechdays

Ř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

Page 23: Twitter hashtag: #cztechdays

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

Page 24: Twitter hashtag: #cztechdays

DEMOUložení stavu aplikace

Page 25: Twitter hashtag: #cztechdays

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

Page 26: Twitter hashtag: #cztechdays

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í

Page 27: Twitter hashtag: #cztechdays

DEMOAktivace prostřednictvím kontraktu

Page 28: Twitter hashtag: #cztechdays

WinRTAsynchronní voláníŽivotní cyklus aplikaceBěh na pozadíZávěrečné úvahy

Agenda

Page 29: Twitter hashtag: #cztechdays

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í

Page 30: Twitter hashtag: #cztechdays

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

Page 31: Twitter hashtag: #cztechdays

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

Page 32: Twitter hashtag: #cztechdays

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…

Page 33: Twitter hashtag: #cztechdays

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

Page 34: Twitter hashtag: #cztechdays

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

Page 35: Twitter hashtag: #cztechdays

DEMOBackground task

Page 36: Twitter hashtag: #cztechdays

WinRTAsynchronní voláníŽivotní cyklus aplikaceBěh na pozadíZávěrečné úvahy

Agenda

Page 37: Twitter hashtag: #cztechdays

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í

Page 38: Twitter hashtag: #cztechdays

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

Page 39: Twitter hashtag: #cztechdays

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

Page 40: Twitter hashtag: #cztechdays

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

Page 41: Twitter hashtag: #cztechdays

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