Při vývoji Android aplikací je klíčové správné zpracování uživatelského rozhraní v různých orientacích zařízení. Fragmenty jsou základní stavební kameny, které umožňují modularitu a flexibilitu UI. V tomto případě se věnujeme konkrétnímu případu, kdy aplikace při spuštění v režimu portrét dynamicky mění zobrazené fragmenty (swapuje je), zatímco v režimu krajina zobrazuje oba fragmenty současně vedle sebe. Tento přístup vychází z tzv. Master/Detail patternu, kde seznam položek představuje „Master“ fragment a detail vybrané položky „Detail“ fragment.

První fragment, který reprezentuje seznam (MasterFragment), je implementován jako rozšíření třídy ListFragment. Díky tomu není potřeba explicitně definovat layout, jelikož ListFragment nabízí základní funkcionalitu seznamu. Pro komunikaci mezi fragmentem a jeho hostitelskou aktivitou je definováno rozhraní OnMasterSelectedListener, jehož implementace v aktivitě umožňuje předávat vybranou položku (například název země) do detailního fragmentu. Toto rozhraní je zajištěno pomocí callbacku nastaveného přímo v MasterFragmentu.

V metodě onViewCreated se seznam naplňuje jednoduchým adapterem s pevně daným polem zemí. Nastavuje se také posluchač události výběru položky, který přes callback předá vybraný text aktivitě. Detailní fragment (DetailFragment) je naopak klasický fragment, který v metodě onCreateView inflatuje vlastní layout, obsahující TextView pro zobrazení detailu. Přijímá data z aktivity pomocí argumentů (Bundle) a aktualizuje obsah TextView přes metodu showSelectedCountry.

Důležitou součástí je zajištění dvou různých layoutů pro aktivitu, aby bylo možné přizpůsobit zobrazení různým orientacím. V režimu portrét je použit jeden fragment, který se podle potřeby vyměňuje. V režimu krajina se naopak zobrazuje současně MasterFragment i DetailFragment, což vyžaduje jiný layout umístěný ve speciálním adresáři res/layout-land. Tím se umožňuje efektivnější využití větší obrazovky.

V rámci hlavní aktivity (MainActivity) je pak definována logika rozpoznávající, zda se jedná o režim jednopanelový (portrét) nebo dvoupanelový (krajina). Na základě toho se provádí buď výměna fragmentů, nebo jejich současné zobrazení. FragmentTransaction slouží k přidávání, odstraňování a nahrazování fragmentů dle aktuálních potřeb. Správné nakládání s fragmenty vyžaduje pečlivé řízení jejich životního cyklu, aby nedocházelo k duplicitám či únikům paměti.

Podstatné je rovněž použití správných knihoven a API. V tomto příkladu je preferováno použití podpůrných knihoven (support library), konkrétně android.support.v4.app.Fragment, což zajišťuje kompatibilitu i se staršími verzemi Androidu a rozšiřuje možnosti fragmentů oproti základnímu frameworku.

Je důležité chápat, že zpracování orientace obrazovky není jen o vizuálním přizpůsobení, ale i o udržení konzistence dat a uživatelského zážitku. Při změně orientace by nemělo dojít ke ztrátě stavu aplikace ani k nekonzistentnímu chování. Proto je třeba využívat metody uchování a předávání dat mezi fragmenty a aktivitami správným způsobem.

Z hlediska uživatele je tento přístup výhodný, protože poskytuje přehlednost a efektivitu při práci s informacemi – v krajinném režimu jsou detaily dostupné okamžitě, v režimu portrét se pak soustředíme na výběr a detail postupně.

Dále je třeba zdůraznit, že architektura založená na fragmentu je flexibilní a umožňuje snadno rozšiřovat aplikaci o nové funkce či optimalizovat UI pro různá zařízení, včetně tabletů a telefonů s různými rozměry obrazovky.

Správná implementace fragmentů, jejich komunikace a přizpůsobení různým režimům vyžaduje důkladné pochopení lifecycle komponent, rozhraní mezi nimi a principu dynamického řízení UI. Tato schopnost je klíčová pro tvorbu moderních, uživatelsky přívětivých a udržitelných Android aplikací.

Jak efektivně používat lokalizační služby a geofencing v Android aplikacích

Při vývoji aplikací pro Android, které vyžadují sledování polohy uživatele, je klíčové pochopit, jak správně implementovat lokalizační služby a geofencing. Tento proces může být efektivní a šetrný k baterii, pokud se použijí správné metody a techniky. V této kapitole se zaměříme na dvě klíčové součásti Androidu pro práci s lokalizací: LocationListener a Geofencing.

Aktualizace polohy pomocí LocationListener

Pro sledování polohy uživatele v reálném čase se v Android aplikacích často používá třída LocationListener společně s metodou requestLocationUpdates(). Tato metoda vyžaduje tři parametry:

  1. GoogleApiClient – Tento objekt poskytuje rozhraní pro komunikaci s Google Play Services, které spravuje lokalizační služby.

  2. LocationRequest – Třída, která určuje parametry pro požadování aktualizací polohy, jako je interval mezi aktualizacemi a priorita přesnosti.

  3. LocationListener – Třída, která definuje zpětnou vazbu pro aktualizace polohy. V metodě onLocationChanged() se provádí zpracování nové polohy.

Vytvoření LocationRequest může vypadat takto:

java
mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(10000); // interval 10 sekund mLocationRequest.setFastestInterval(10000); // nejrychlejší interval mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // maximální přesnost

Je důležité si uvědomit, že čím častěji budete požadovat aktualizace polohy, tím více prostředků zařízení bude spotřebováno, což může negativně ovlivnit výdrž baterie. Proto je doporučeno používat co nejdelší interval mezi požadavky, pokud to není nezbytné pro konkrétní funkčnost aplikace.

Pokud aplikace již nepotřebuje lokalizační aktualizace, je nezbytné je vypnout voláním metody removeLocationUpdates(). To ušetří baterii a systémové prostředky. Například:

java
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mLocationListener);

Ve většině aplikací je dobrým zvykem zastavit aktualizace polohy, když aplikace není na popředí, což může být zajištěno sledováním životního cyklu aplikace.

Geofencing: Sledování vstupu a výstupu z definovaných oblastí

Pokud vaše aplikace potřebuje detekovat, kdy uživatel vstoupí do určité oblasti nebo ji opustí, je geofencing ideální volbou. Geofencing vám umožňuje definovat geografickou oblast (určenou zeměpisnou šířkou a délkou) a sledovat, zda uživatel tuto oblast vstoupí nebo opustí. Tento proces je efektivní, protože nevyžaduje neustálé sledování polohy, což šetří systémové prostředky.

Každý geofence má několik klíčových vlastností:

  • Lokalizace (široká a délka): Určuje geografickou polohu středu oblasti.

  • Poloměr: Velikost oblasti, která je sledována, vyjádřena v metrech.

  • Loitering delay: Doba, po kterou může uživatel zůstat uvnitř oblasti, než systém pošle upozornění.

  • Expirace: Čas, po který geofence zůstane aktivní, než se automaticky zruší.

  • Typ přechodu: Může být:

    • GEOFENCE_TRANSITION_ENTER – vstup do oblasti.

    • GEOFENCE_TRANSITION_EXIT – opuštění oblasti.

    • INITIAL_TRIGGER_DWELL – zdržení se v oblasti po určitou dobu.

Geofencing je ideální pro aplikace, které potřebují upozornit uživatele při vstupu do určité lokality (například při vstupu do obchodu nebo do konkrétní oblasti ve městě).

Pro implementaci geofencingu je třeba provést několik kroků, včetně vytvoření Geofence objektu a GeofencingRequest. Po definování těchto objektů je potřeba nastavit GoogleApiClient a použít API pro přidání geofences.

Krok za krokem implementace Geofencing

  1. Vytvoření geofencingu vyžaduje přidání několika závislostí a povolení v Android manifestu.

  2. Poté musíte definovat třídu GeofenceIntentService, která bude zpracovávat oznámení, když dojde k přechodu geofence (například vstup nebo výstup z oblasti).

  3. Zajistíte komunikaci s GoogleApiClient a přidání geofencingu do aplikace pomocí metody addGeofences().

  4. Dále je třeba správně zpracovávat výsledky a výjimky, například při neúspěšném připojení k API nebo při bezpečnostních problémech (například chybějící oprávnění).

Pokud je implementace geofencingu správně provedena, můžete efektivně sledovat vstupy a výstupy z různých oblastí a reagovat na ně v reálném čase, aniž byste museli neustále sledovat polohu uživatele.

Důležité je, že Android podporuje až 100 geofences na uživatele, což znamená, že aplikace může sledovat více oblastí současně. Pokud aplikace potřebuje více geofences, je nutné implementovat strategii pro jejich správu.

Co je třeba si pamatovat

Při práci s lokalizačními službami je důležité vždy mít na paměti optimalizaci výkonu a šetření baterie. I když přesné a časté sledování polohy může být nezbytné pro určité aplikace, je třeba zvážit, zda to není možné nahradit geofencingem, který je energeticky efektivnější. Aplikace by měla správně reagovat na životní cyklus, aby se vyhnula neúměrnému využívání systémových prostředků, když není v popředí.

Pokud aplikace vyžaduje neustálé sledování polohy, může být rozumné zvážit implementaci služeb na pozadí, které umožní efektivní zpracování aktualizací a notifikací.