Vytváření aplikací pro Android je často spojeno s práci s aktivitami – základními stavebními bloky každé aplikace. Aktivita představuje jednotlivý obrazovku aplikace, která uživateli umožňuje interakci s různými prvky, jako jsou tlačítka, formuláře a seznamy. I když se to může zdát jako jednoduchý prvek, ve skutečnosti existuje mnoho aspektů, které je třeba pochopit a správně implementovat, aby vaše aplikace byla efektivní, intuitivní a dobře fungovala i na různých typech zařízení.
Pro efektivní vývoj aplikací v Androidu je kladeno velké důraz na správné použití a správu aktivit. Aktivita není jen o zobrazení obsahu na obrazovce; je to komplexní součást systému Android, která zahrnuje životní cyklus, přechody mezi obrazovkami, předávání dat a zachování stavu aplikace. Tyto aspekty hrají zásadní roli v tom, jak aplikace reaguje na interakce uživatele a jak udržuje konzistentní uživatelský zážitek.
Nejdůležitější součástí vývoje s aktivitami je porozumění jejich životnímu cyklu. Každá aktivita prochází různými fázemi, od inicializace až po zničení. V průběhu této doby může být třeba reagovat na různé události, jako je změna orientace zařízení nebo minimalizace aplikace do pozadí. V tomto procesu se často uchovávají údaje, které mohou být ztraceny při zničení aktivity, což vede k nutnosti implementovat techniky pro správné uložení stavu aplikace, jako je použití metody onSaveInstanceState.
Pokud jde o přechody mezi aktivitami, je třeba správně využívat objekt Intent. Tento nástroj umožňuje komunikaci mezi aktivitami, spouštění nových obrazovek a předávání dat mezi nimi. Například při vytváření aplikace, která zobrazuje seznam položek, může být potřeba přepnout na novou obrazovku při kliknutí na položku seznamu. Intent umožňuje přenést potřebná data, jako je identifikátor položky, a spustit druhou aktivitu s těmito informacemi.
Kromě samotných aktivit je třeba v aplikaci často používat také fragmenty. Fragmenty umožňují flexibilněji navrhovat uživatelské rozhraní a přizpůsobit aplikaci různým velikostem obrazovky. Fragmenty mohou být přidávány nebo odebírány za běhu, což je užitečné zejména u zařízení s většími obrazovkami, kde je potřeba zobrazit více informací současně. Správné použití fragmentů může zásadně zlepšit uživatelský zážitek a výkon aplikace.
Další klíčovým prvkem v práci s aktivitami je správa paměti. Aplikace by měla být schopná efektivně spravovat paměť a uvolňovat zdroje, když není aktivně využívána. To zahrnuje správné ukončení aktivit, čištění neaktivních fragmentů a udržování efektivního životního cyklu. Někdy může být nutné použít asynchronní úkoly nebo záznamy, aby se předešlo blokování hlavního vlákna aplikace.
Při práci s aktivitami se často setkáváme s potřebou ukládat a načítat data. Tento proces může být realizován prostřednictvím interního nebo externího úložiště, SQLite databáze nebo dalších metod, které Android poskytuje. Každý typ úložiště má své výhody a nevýhody, a proto je důležité vybrat ten správný na základě požadavků aplikace. Například pro ukládání malých objemů dat, jako jsou uživatelská nastavení nebo historie vyhledávání, je ideální použití interního úložiště.
Nakonec, nezapomínejte na optimalizaci výkonu aplikace. Někdy i zdánlivě malé změny v přechodech mezi aktivitami nebo fragmenty mohou ovlivnit celkový výkon aplikace. Použití správného layoutu, minimalizace nepotřebného vytváření nových instancí aktivit a fragmentů a optimalizace načítání dat jsou faktory, které mohou výrazně zlepšit plynulost a rychlost aplikace.
Při práci s aktivitami je důležité nejen chápat základní koncepty, ale i mít na paměti širší souvislosti a možné problémy, které mohou vzniknout při vývoji složitějších aplikací. Uživatelé očekávají, že aplikace budou rychlé, intuitivní a plynulé, což vyžaduje důkladnou práci s těmito základy. Ať už jde o uchování stavu, správu paměti nebo efektivní využívání fragmentů, každé rozhodnutí, které v této oblasti učiníte, ovlivní celkový dojem uživatele z vaší aplikace.
Jak přepínat mezi Fragmenty a předávat mezi nimi data v Android aplikaci
Fragmenty představují klíčový prvek architektury moderních Android aplikací. Umožňují oddělení jednotlivých částí uživatelského rozhraní do samostatně znovupoužitelných komponent, které lze dynamicky přidávat, nahrazovat a spravovat v rámci jediné Activity. V této části se podíváme na způsob, jak fragmenty vytvářet, přepínat mezi nimi a bezpečně předávat data.
Začneme vytvořením dvou fragmentů. Každý z nich má vlastní XML layout soubor – fragment_one.xml a fragment_two.xml. Jediným rozdílem mezi nimi je zobrazený text. V každém fragmentu definujeme třídu, která dědí ze třídy Fragment a přepisuje metodu onCreateView(), v níž nafukujeme odpovídající layout pomocí LayoutInflater. Klíčovým bodem je import správné třídy android.support.v4.app.Fragment, což zajistí zpětnou kompatibilitu.
Hlavní aktivita (MainActivity) pak obsahuje kontejner (např. FrameLayout), do kterého jsou fragmenty vkládány, a tlačítko, které zajišťuje přepínání mezi nimi. Ve třídě MainActivity si připravíme dvě instance fragmentů a proměnnou showingFragment, která uchovává informaci o tom, který fragment je právě zobrazen. V metodě onCreate() inicializujeme fragmenty, získáme instanci FragmentManageru, začneme FragmentTransaction a přidáme počáteční fragment do rozhraní pomocí add(), následně voláme commit() pro potvrzení transakce.
Přepínání probíhá v metodě switchFragment(View view). Pomocí replace() nahradíme aktuální fragment druhým a aktualizujeme hodnotu showingFragment. Každé přepnutí vyvolává novou transakci, která je zakončena metodou commit().
Důležitou součástí práce s fragmenty je práce s tzv. back stackem. Uživatel očekává, že po stisknutí tlačítka zpět se vrátí na předchozí "obrazovku", bez ohledu na to, zda šlo o jinou aktivitu nebo fragment. Android umožňuje tuto logiku jednoduše zajistit přidáním volání addToBackStack() před commit() v rámci fragmentové transakce. Pokud fragment přidáme na zásobník, není po jeho nahrazení zničen, ale pouze zastaven. Při návratu je znovu spuštěn, nikoli znovuvytvořen. Bez této volby by se fragment po nahrazení okamžitě zničil a při návratu by bylo nutné ho kompletně znovu vytvořit.
Další běžnou potřebou je předávání dat mezi fragmenty – typickým příkladem je tzv. Master/Detail vzor, kde jeden fragment zobrazuje seznam (např. e-mailů) a druhý jejich detaily. Tento koncept lze implementovat buď jako přepínání fragmentů v rámci jednoho rozvržení, nebo jako souběžné zobrazení dvou panelů na větší obrazovce.
Fragmenty by však neměly mezi sebou komunikovat přímo. Přímé vazby mezi fragmenty narušují jejich nezávislost a ztěžují údržbu kódu, zvlášť pokud se rozvržení mění a ne všechny fragmenty jsou vždy přítomné. Komunikace má probíhat výhradně prostřednictvím hostující aktivity, která funguje jako zprostředkovatel – zachytává události, směruje data a zajišťuje přepínání fragmentů.
Nejčistší způsob, jak toho dosáhnout, je definování rozhraní (interface), kterým fragment vyšle událost do aktivity. Aktivita pak může na základě této události zareagovat, např. spuštěním nové transakce a nahrazením fragmentu jiným. Tento přístup odpovídá stejnému principu, jakým například tlačítka posílají své události (kliknutí) aktivitě.
Zásadní je si uvědomit, že fragmenty nejsou samostatné komponenty jako aktivity – nemají vlastní životní cyklus v systému Android, ale jsou plně závislé na aktivitě, která je hostí. Správné pochopení toho, jak fragmenty vznikají, jak zanikají, jak reagují na změny konfigurace (například otočení obrazovky), a jak udržovat jejich stav, je základní podmínkou pro jejich efektivní použití.
Jak pracovat s daty v Androidu: Ukládání a čtení souborů v interním úložišti
V systému Android se s daty pracuje různými způsoby v závislosti na požadavcích aplikace. Pro ukládání a načítání jednoduchých údajů, jako je uživatelské jméno, slouží SharedPreferences, zatímco pro práci s textovými a binárními soubory v interním úložišti Android nabízí přístup k souborům pomocí speciálních API. Tato kapitola se zaměřuje na obě možnosti, vysvětluje principy jejich fungování a ukazuje konkrétní příklady implementace.
Pro ukládání dat do SharedPreferences je nutné definovat klíč a hodnotu, přičemž data jsou uchovávána v jednoduché formě „klíč-hodnota“. Můžeme je použít například pro uchování jména uživatele, které se automaticky načítá při spuštění aplikace.
V první fázi je nutné v ActivityMain.java přidat několik globálních deklarací a inicializovat objekt pro editaci textu:
Následně se v metodě onCreate() provede načtení uloženého jména z SharedPreferences:
Pokud je jméno uloženo, aplikace ho zobrazí; jinak se objeví výchozí zpráva. Pro uložení nového jména se přidává metoda saveName():
Pokud aplikaci restartujete, uložené jméno se načte a zobrazí v TextView. Zde je klíčovým bodem metoda commit(), která zajistí, že změny budou uloženy.
Pokud by uživatel potřeboval různé profily (například pro více uživatelů), lze použít getSharedPreferences(), což umožňuje uchovávat různé preference v různých souborech.
Dalším způsobem, jak pracovat s daty, je použití interního úložiště, když potřebujete ukládat větší množství dat, například textové soubory. Android umožňuje číst a zapisovat soubory do interního úložiště pomocí FileOutputStream pro zápis a InputStream pro čtení.
Pro tento účel vytvoříme projekt, který bude číst a zapisovat textový soubor:
-
Nejprve upravíme main_activity.xml, aby obsahoval EditText pro zadávání textu a tlačítka pro čtení a zápis dat.
-
V ActivityMain.java přidáme následující proměnné:
-
V metodě onCreate() inicializujeme EditText:
-
Pro zápis do souboru vytvoříme metodu writeFile():
-
A pro čtení souboru přidáme metodu readFile():
Tato metoda načte obsah souboru a zobrazí ho v EditText. Soubor bude uložen v interním úložišti aplikace, což znamená, že bude přístupný pouze pro tuto aplikaci a nikoli pro jiné aplikace nebo uživatele.
Interní úložiště je ideální pro uchovávání soukromých dat, která jsou relevantní pouze pro danou aplikaci. Pro příklad výše uvedený je soubor uložen ve složce /data/data/[název balíčku]/files/. Pro přístup k těmto souborům bude nutné mít rootovaný telefon, což činí tento přístup nepraktickým pro běžného uživatele.
Pokud chcete ukládat data, která nejsou soukromá, například ke stažení článků nebo obrázků, doporučuje se použít externí úložiště. To je úložiště, které je přístupné i mimo vaši aplikaci. Nicméně před přístupem do externího úložiště je nutné zkontrolovat, zda je dostupné, a to kvůli různým bezpečnostním a hardware omezením.
Pokud budete potřebovat data uchovávat pouze dočasně, je dobré využít cache adresář. Tento adresář je spravován operačním systémem Android a může být vyčištěn, když systém potřebuje uvolnit místo. Pro přístup k němu slouží metoda getCacheDir(). Cache je vhodná pro uchovávání dočasných dat, která neovlivňují chod aplikace.
Jak správně použít výchozí fotoaparát v Android aplikaci pro pořízení a uložení fotografie
Pro zajištění možnosti pořízení fotografie přímo z vaší aplikace je nejjednodušším a nejpřístupnějším řešením využití výchozí aplikace fotoaparátu, která je dostupná na většině zařízení s Androidem. Postup spočívá ve vytvoření Intentu s akcí MediaStore.ACTION_IMAGE_CAPTURE, který spustí externí aplikaci fotoaparátu. Nejdůležitější je ověřit, zda je k dispozici aplikace, která zvládne daný Intent zpracovat, což zabrání pádům aplikace v případě, že fotoaparát chybí.
Fotografie je vhodné uložit na veřejně přístupné místo, například do složky obrázků v externí paměti zařízení (Environment.DIRECTORY_PICTURES). Pro vytvoření jedinečného názvu souboru se používá časové razítko formátované podle vzoru yyyyMMdd_HHmmss. V Intentu se následně předává URI tohoto souboru pomocí klíče MediaStore.EXTRA_OUTPUT, což zajistí, že aplikace fotoaparátu uloží snímek přímo na dané místo. Po dokončení fotografování přijde zpět do vaší aplikace callback metoda onActivityResult(), kde lze fotografii načíst a zobrazit v ImageView.
Pokud není důležité místo uložení fotografie, lze Intent spustit bez zadání EXTRA_OUTPUT. V takovém případě se v metodě onActivityResult() vrací náhledový obrázek jako malý bitmapový objekt, který je možné rychle zobrazit, avšak v nižším rozlišení. Pro načtení obrázku v plném rozlišení lze využít URI z Intentu a přes ContentResolver načíst bitmapu. Tento postup je flexibilní, ale neumožňuje kontrolu přesného umístění uložené fotografie.
Podobným způsobem lze vyvolat i výchozí videozáznamovou aplikaci pomocí Intentu s akcí MediaStore.ACTION_VIDEO_CAPTURE. Po nahrání videa je jeho URI dostupné ve výsledném Intentu, což umožňuje další zpracování nebo přehrání videa.
V případě potřeby detailnější kontroly nad fotoaparátem nabízí Android dvě API – původní Camera API a modernější Camera2 API. Camera2 API poskytuje širší možnosti konfigurace a lepší výkon, ale není dostupné na starších zařízeních, která stále představují významný podíl trhu. Proto je vhodné aplikaci navrhnout tak, aby podporovala obě API – nové pro nová zařízení a staré pro zpětnou kompatibilitu.
Pro zobrazení náhledu kamery je možné využít TextureView místo tradičního SurfaceView. TextureView umožňuje větší flexibilitu v práci s grafikou a je kompatibilní jak se starým, tak i novým API kamery. Minimální požadovaná verze SDK je 14, což pokrývá většinu současných zařízení.
Při implementaci fotoaparátu je nezbytné správně ošetřit události životního cyklu, řídit přístup k externí paměti a respektovat uživatelská oprávnění, která jsou v novějších verzích Androidu udělována za běhu aplikace. Bez správného zpracování těchto aspektů může dojít k chybám nebo odmítnutí přístupu k fotoaparátu či souborovému systému.
Pro efektivní správu velkých obrazových souborů je důležité optimalizovat jejich velikost při načítání do paměti, aby nedošlo k vyčerpání zdrojů zařízení a následnému pádu aplikace. Toho lze dosáhnout například škálováním bitmapy podle aktuálních potřeb zobrazení.
Je nutné si uvědomit, že integrace fotoaparátu do aplikace není jen o samotném pořízení snímku, ale také o správném řízení práv, kompatibilitě s různými verzemi Androidu a vhodné správě uložených dat tak, aby uživatelská zkušenost byla plynulá a spolehlivá.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский