Lekce 2 - Struktura Xamarin projektu a životní cyklus aplikace
V minulé lekci, Úvod do Xamarin, jsme si vysvětlili, co to Xamarin vlastně je, co nám umožňuje, a nainstalovali a nastavili jsme si Visual Studio s prvním projektem.
V dnešním tutoriálu se podíváme na strukturu Xamarin.Forms projektu a životní cyklus mobilní aplikace.
Struktura Xamarin.Forms projektu
Když se podíváme do Solution Exploreru, vidíme vygenerovanou strukturu
rozdělenou do 4 hlavních částí (názvy se budou lišit podle názvu
projektu, já si ho pojmenoval FirstApp
).

C# FirstApp
Této části se budeme věnovat nejvíce. Zde budeme psát kód společný
pro všechny platformy. Nejvíce nás teď budou zajímat soubory
MainPage.xaml
a MainPage.xaml.cs
. Jistě již
tušíte, že soubor MainPage.xaml
bude sloužit k rozložení
ovládacích prvků v layoutu a MainPage.xaml.cs
bude sloužit k
"oživení" (obsluhování) těchto prvků pomocí jazyka C# .NET.
FirstApp.Android
V Androidu nás budou nejvíce zajímat následující soubory a složky:
- Connected Services - Zde se budou nacházet připojené služby jako např. databáze a podobně. K tomu se dostaneme dále v kurzu.
- Properties - Zde se nachází velice důležitý soubor
AndroidManifest.xml
. V tomto souboru nastavujeme minimální a cílovou verzi API, ikonu a mnoho dalších parametrů naší aplikace. Resources/
- Zde se budou nacházet obrázky pro naši aplikaci. Všimněte si složekDrawable/
a jejich dalších variant. Je to proto, že i mobilní zařízení mají, podobně jako počítače, různá rozlišení a velikosti a proto budeme potřebovat přizpůsobit rozložení komponent a rozlišení obrázků velikosti displeje každého zařízení. Například pro tablet s full HD použijeme největší rozlišení obrázků, kdežto pro nějaký malý telefon zas to nejmenší, aby aplikace zbytečně nezabírala příliš mnoho paměti a nebyla pomalá.MainActivity.cs
- Soubor obsahující základní aktivitu při spuštění aplikace. Více o aktivitách si povíme níže.
FirstApp.iOS
Zde budou základní třídy pro chod iOS aplikace, obrázky a skripty speciálně pro operační systém iOS. Princip je podobný jako u Androidu, takže prozatím netřeba popisovat.
FirstApp.UWP
Tuto možnost uvidíte, pouze pokud jste při instalaci zvolili i UWP (Universal Windows Platform) – platforma pro vývoj moderních aplikací pro Windows 10. Pokud budete chtít tento nástroj doinstalovat později, můžete tak učinit v instalátoru Visual Studia. Jelikož kód pro Windows 10 je v C# a nevyžaduje v začátcích žádné další úpravy, nebudeme se mu v prvních lekcích věnovat.
Projektovou strukturu si podrobně vysvětlíme během praktických lekcí dále v kurzu. Vysvětlovat vše nyní by nemělo valný význam, neboť ještě nemáme potřebné znalosti a spíše by nás to mátlo.
Životní cyklus Android aplikace
Aktivity
Aktivita (Activity) referuje na konkrétní obrazovku naší aplikace a definuje celý svůj život od otevření / zaktivnění až do zavření / zrušení, čemuž říkáme životní cyklus aktivity. Ten obsahuje několik možných fází a metod, které se volají jak se mezi fázemi životního cyklu přechází. Důležité je si zapamatovat, že každá jednotlivá obrazovka (stránka) aplikace musí mít svou vlastní aktivitu. Například:
- Když spustíme aplikaci, tak jako první uvidíme nějakou animaci s logem, to bude první aktivita.
- Pak základní menu (2. aktivita).
- Klikneme na odkaz v menu a otevře se nám nová obrazovka (3. aktivita) a tak pořád dále.
Každá aktivita musí mít metodu OnCreate()
a
již nepovinně může mít další metody.
Životní cyklus aktivity
Teď již víme, že existují aktivity, které musí mít metodu
OnCreate()
a mohou mít i další metody. Kdy a proč se ale které
metody volají? Jistě znáte, že když hrajete hru na telefonu a někdo vám
volá, hra automaticky přejde do pauzy a zobrazí se vám příchozí hovor. Po
ukončení hovoru se můžete opět vrátit do hry, která bude ve stavu pauzy.
Jistě každý chápe význam různých stavů životního cyklu,
reprezentovaných danými metodami. Podívejme se na jeho grafické
znázornění:

Stav aktivity
Každá aktivita se nachází současně jen v jednom z následujících stavů:
- Běží - Aktivita se úspěšně spustila a běží na popředí, je tedy pro uživatele viditelná.
- Pauza - Aktivita jde vidět, je ale například překrytá jinou aktivitou. (Upozornění na příchozí SMS, hovor, nebo například dialog o plném nabití baterie při nabíjení). Uživatel se k takové aktivitě nijak nedostane a nemůže s ní pracovat.
- Zastavená - Aktivita není vidět, uživatel k ní nemá přístup, ale její objekt ještě nebyl úplně zničen. Uživatel se k ní bude moci vrátit, pokud nebude zničena, například nedostatkem paměti.
- Ukončená - Aktivita je úplně mrtvá.
Při přechodech mezi těmito stavy se volají následující metody.
Metoda OnCreate()
Je základní metodou, která se spustí jako první a zahájí nám životní cyklus aktivity. Například když uživatel spustí aplikaci, tak tato metoda nám určuje, jaké se mají načíst obrázky, jaké zde budou komponenty, zda-li má aplikace běžet ve fullscreenu a podobně. Zkrátka nám zpracuje celý design a funkce tak, jak jsme je navrhli. Je to jediná metoda, kterou je povinné použít!
Metoda OnStart()
Volá se, pokud aktivita byla poprvé spuštěna (po OnCreate()
)
nebo byla aktivována po svém skrytí (příchozí SMS, systémový dialog
například o nabití baterie nebo jiný dialog). Tato metoda nemůže dostat
uživatelský vstup.
Metoda OnResume()
Volá se těsně před tím, než je aktivita posunuta do popředí (restart, první spuštění nebo odpauzování), může dostat uživatelský vstup.
Metoda OnPause()
Volá se před přechodem aktivity na pozadí. Systém dostává pravomoc násilného ukončení aktivity.
Metoda OnStop()
Volá se, když se má aktivita zastavit, není viditelná pro uživatele.
Metoda OnDestroy()
Volá se před zrušením aktivity.
Metoda OnRestart()
Jak vyplývá z předchozího diagramu, pokud byla zavolána
OnStop()
a aktivita se restartuje, volá se
OnRestart()
, jenž se provede před OnStart()
.
Tyto metody si můžete zkusit přepsat v Android projektu ve třídě
MainActivity
. Dokonce si můžete všimnout, že metoda
OnCreate()
je tam již přepsaná a volá logiku pro vytvoření
Xamarin.Forms aplikace.
Životní cyklus iOS aplikace
Stavy iOS aplikace
Podobně jako na Androidu, tak i každá iOS aplikace se vždy nachází současně jen v jednom z následujících stavů:
- Neběží - Aplikace buďto nebyla ještě spuštěna, anebo byla vypnuta systémem.
- Neaktivní - Aplikace sice běží v popředí, ale uživatel s ní nemůže nijak pracovat. To může nastat např. při zobrazení upozornění na příchozí SMS nebo hovor.
- Aktivní - Aplikace se úspěšně spustila a běží na popředí, je tedy pro uživatele viditelná. Z nebo do tohoto stavu se vždy přechází přes stav Neaktivní.
- Na pozadí - Aplikace není vidět, uživatel k ní nemá přístup, ale stále může volat nějaký kód.
- Pozastavená - Aplikace není vidět, uživatel k ní nemá přístup a nemůže volat žádný kód. Systém přesune aplikaci do tohoto stavu automaticky např. při nedostatku operační paměti.

Při přechodech mezi těmito stavy se volají následující metody:
Metoda OnActivated()
Volá se při každém otevření aplikace, která se poté nachází ve stavu Aktivní.
Metoda FinishedLaunching()
Volá se jen při spuštění aplikace.
Metoda
WillEnterForeground()
Volá se těsně před tím, než se vrátíme do již spuštěné aplikace.
Spolu s touto metodou se zavolá také metoda OnActivated()
.
Metoda
OnResignActivation()
Volá se při přechodu aplikace do stavu Neaktivní.
Metoda
DidEnterBackground()
Volá se, když aplikace přejde do stavu Na pozadí. Např. při stisknutí Home button.
Metoda WillTerminate()
Volá se těsně před ukončením aplikace, avšak není zaručené, že se tato metoda doopravdy zavolá.
Tyto metody můžete přepisovat v iOS projektu ve třídě
AppDelegate
, kde se již nachází přepsaná metoda
FinishedLaunching()
, která volá logiku pro vytvoření
Xamarin.Forms aplikace.
Životní cyklus Xamarin.Forms aplikace
Výše uvedené metody životních cyklů Android a iOS aplikace jsou specifické pro danou platformu. Tudíž s nimi můžeme pracovat pouze v projektech reprezentujících dané platformy. Proto Xamarin.Forms poskytuje vlastní metody, které jsou univerzální pro všechny platformy:
Metoda OnStart()
Volá se při zapnutí aplikace.
Metoda OnSleep()
Volá se pokaždé, když opustíme aplikaci.
Metoda OnResume()
Volá se při navrácení do již spuštěné aplikace.
Všechny dnes uvedené metody jsou virtuální, tudíž je můžeme
přepisovat a tím jim dodat vlastní logiku. V Xamarin.Forms sdíleném
projektu jsou pro nás dokonce již předpřipravené pro přepsání ve
třídě App
(soubor App.xaml.cs
).
V příští lekci, Jazyk XAML v Xamarin.Forms, si popíšeme základy jazyka XAML pro tvorbu uživatelského rozhraní v Xamarin aplikacích.