Při vývoji aplikací pro Android je klíčové rozumět tomu, jak aktivity fungují a jak je správně deklarovat. Aktivita v Androidu je základní komponenta, která reprezentuje jednu obrazovku uživatelského rozhraní. Správné řízení aktivit je zásadní pro zajištění efektivní navigace a funkčnosti aplikace. V této kapitole se podíváme na základní kroky k vytvoření a spuštění aktivit, stejně jako na klíčové aspekty práce s manifestem a záměry (intenty), které umožňují komunikaci mezi aktivitami.

Prvním krokem je otevření Android Studia. Po spuštění programu se zobrazí dialog "Welcome to Android Studio", kde si vybereme možnost "Start a new Android Studio project". Při vytváření projektu je důležité zadat název aplikace, například "DeclareAnActivity". Jakmile je název zadán, klikneme na tlačítko "Next". V dalším kroku je nutné zvolit typ aktivity, kterou chceme vytvořit. V tomto případě si zvolíme "Blank Activity", což nám vytvoří základní šablonu pro aplikaci, která neobsahuje žádný předefinovaný obsah, čímž nám dává maximální flexibilitu pro další práci.

Po výběru aktivity přichází volba minimální verze Android SDK, kterou má aplikace podporovat. V našem příkladu zvolíme Android 6.0 (API 23). Tato volba není zásadní pro samotný proces deklarace aktivity, ale doporučuje se vždy vybrat co nejnovější dostupnou verzi SDK, protože to umožňuje využívat nejnovější funkce a bezpečnostní aktualizace.

Po dokončení nastavení Android Studio vytvoří všechny potřebné soubory pro nový projekt. Nejvíce nás budou zajímat soubory "MainActivity.java" a "AndroidManifest.xml". Soubor MainActivity.java bude obsahovat kód pro samotnou aktivitu, zatímco AndroidManifest.xml bude sloužit k deklaraci této aktivity v rámci aplikace.

Manifest je klíčový pro správnou funkci aplikace. Bez správné deklarace aktivit v manifestu nebudou součásti aplikace přístupné a jejich použití povede k vyvolání výjimky při běhu aplikace. V rámci deklarace aktivity v manifestu se používá element <activity>, ve kterém je nutné specifikovat název třídy aktivity pomocí atributu android:name. Tento krok zajišťuje, že daná aktivita bude součástí aplikace a může být spuštěna. Dalším důležitým atributem je android:label, který určuje název, jenž se zobrazuje na obrazovce uživatele, pokud je daná aktivita spouštěna jako hlavní.

Jakmile máme připravenou základní aktivitu, můžeme přistoupit k práci se záměry (intenty). Intent je objekt, který umožňuje komunikaci mezi různými komponentami aplikace, jako jsou aktivity, služby nebo přijímače událostí. Záměry mohou také sloužit k interakci s externími aplikacemi. Například, pokud chceme otevřít webovou stránku v prohlížeči, můžeme použít jednoduchý záměr s akcí Intent.ACTION_VIEW a předat mu URL adresu, která má být otevřena.

Pro tento účel vytvoříme funkci, která spustí záměr, jakmile uživatel klikne na tlačítko. Kód funkce bude vypadat takto:

java
public void launchIntent(View view) {
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("https://www.packtpub.com/")); startActivity(intent); }

Pokud v kódu narazíte na varování "Cannot resolve symbol 'Intent'", znamená to, že je potřeba přidat knihovnu pro práci se záměry. Tento problém lze vyřešit buď manuálně přidáním importu, nebo kliknutím na označený text a použitím klávesové zkratky Alt + Enter, čímž Android Studio automaticky přidá potřebné importy.

Dále je třeba přidat odpovídající XML kód pro tlačítko v souboru activity_main.xml, které bude spouštět naši funkci. Jakmile aplikaci spustíme, zmáčknutí tlačítka otevře webový prohlížeč a zobrazí požadovanou URL.

Tento příklad ukazuje základní použití záměrů pro interakci s jinými aplikacemi. Intenty mohou být mnohem silnější, když začneme pracovat s pokročilými funkcemi, jako jsou sdílené informace mezi aplikacemi, nebo používání specifických API pro interakci s hardwarem zařízení. Důležité je si uvědomit, že při práci s intenty je nutné správně deklarovat všechny související komponenty v manifestu. Bez této deklarace nebude žádná aktivita, služba nebo přijímač schopná správně komunikovat s ostatními částmi aplikace.

Pokud aplikace vyžaduje komunikaci mezi více aktivitami, můžeme jednoduše přepínat mezi aktivitami pomocí záměrů. K tomu bude potřeba definovat více aktivit v AndroidManifest.xml a přidat tlačítka nebo jiné prvky pro spuštění konkrétních aktivit. Tato technika je nezbytná pro aplikace, které obsahují více obrazovek a vyžadují správné řízení navigace.

Je důležité si uvědomit, že při spouštění nových aktivit může být nutné správně nastavit i zpětné předávání výsledků mezi aktivitami. K tomu slouží metoda startActivityForResult(), která umožňuje získat výsledek z jiné aktivity.

Endtext

Jak fungují přechodové animace v Androidu a jak je správně implementovat

Android Transition Framework nabízí výkonné nástroje pro vytváření přechodových animací mezi scénami v rámci aplikace. Přechodová animace definuje výchozí a cílovou scénu a aplikuje na ně přechod, který může zahrnovat změnu polohy, velikosti nebo průhlednosti pohledů (views). Tento systém umožňuje vytvářet plynulé vizuální změny mezi dvěma stavy uživatelského rozhraní, čímž výrazně zvyšuje estetiku i uživatelský zážitek.

Framework podporuje skupinové animace, kde se animace aplikuje na celou hierarchii pohledů, i přechodově řízené animace, které jsou založené na změnách vlastností. Dále poskytuje vestavěné efekty jako vyblednutí (fade-in/fade-out) nebo pohyb, a podporuje načítání těchto animací ze zdrojových XML souborů. Klíčovou výhodou je podpora callbacků, které umožňují reagovat na různé fáze animace.

Každá přechodová animace se skládá ze tří částí: počáteční scéna (výchozí rozvržení), přechod (změna typu) a cílová scéna (konečné rozvržení). Android poskytuje tři základní typy přechodů: AutoTransition (kombinuje vyblednutí, pohyb a změnu velikosti), Fade (vyblednutí s možností určení směru) a ChangeBounds (změna polohy a velikosti). Tyto přechody lze definovat jak v XML, tak přímo v kódu.

Přechodová animace začíná vytvořením výchozí scény pomocí metody Scene.getSceneForLayout(), následuje vytvoření přechodu skrze TransitionInflater.from().inflateTransition(), a nakonec se animace spouští metodou TransitionManager.go(). Tento proces je překvapivě jednoduchý, ale vyžaduje důslednou přípravu odpovídajících zdrojových souborů.

Například v typické implementaci začínáme úpravou výchozího layout souboru activity_main.xml a vytvořením cílového layoutu activity_main_end.xml. Poté se vytvoří adresář transition a do něj XML soubor s definicí přechodu, například transition_move.xml. V kódu aktivity se definuje metoda goAnimate(), která při aktivaci načte cílovou scénu a aplikuje na ni definovaný přechod.

Alternativně lze celý proces implementovat výhradně v kódu bez použití XML. V tomto případě vytvoříme objekt typu Scene, nastavíme nový ChangeBounds přechod, a poté prostřednictvím beginDelayedTransition() a změny layout parametrů jednotlivých prvků spustíme animaci. Tento přístup poskytuje větší flexibilitu a dynamiku, ale je o něco náročnější na údržbu.

Přestože Transition Framework funguje spolehlivě, je třeba mít na paměti jeho omezení. Některé třídy totiž s přechodovými animacemi nepracují korektně. Například SurfaceView může vykazovat chyby synchronizace, protože animace probíhá mimo hlavní UI vlákno. TextView při změně velikosti textu může skákat do finálního stavu bez plynulé animace. Komponenty odvozené od AdapterView, jako jsou ListView nebo GridView, mohou způsobovat zablokování. Rovněž TextureView není vždy plně kompatibilní s přechodovými efekty.

Důležité je pochopit, že přechodové animace nejsou pouze vizuální ozdobou, ale součástí interakční logiky aplikace. Plynulý přechod mezi dvěma stavy uživatelského rozhraní snižuje kognitivní zátěž uživatele, a tím zvyšuje jeho komfort. Implementace těchto animací by měla být součástí návrhu UI/UX od počátku, nikoli až dodatečným vylepšením.

Kromě základních přechodů lze vytvářet i složitější animace kombinováním více přechodů, např. pomocí TransitionSet, kde lze specifikovat posloupnost či paralelní provádění jednotlivých efektů. Také lze definovat vlastní přechody rozšířením třídy Transition, což umožňuje hlubší kontrolu nad tím, jak a co se má během přechodu animovat.

Jak získat výsledky z druhé aktivity v Androidu

Chcete-li z druhé aktivity získat výsledek, použijete metodu startActivityForResult(), která se osvědčila jako efektivní způsob, jak přenášet data mezi aktivitami a přijímat zpětné výsledky. Tato metoda je především užitečná v případech, kdy potřebujete, aby uživatel provedl nějakou akci v jedné aktivitě a výsledky této akce byly zpracovány v jiné.

V tomto procesu je několik kroků, které je nutné provést, abyste správně nastavili komunikaci mezi aktivitami. V následujícím textu ukážeme, jak implementovat tento mechanismus, včetně nezbytných změn v kódu.

Začněte tím, že do souboru MainActivity.java přidáte následující konstantu, která bude sloužit pro identifikaci výsledku, který chcete obdržet:

java
public static final String REQUEST_RESULT="REQUEST_RESULT";

Poté, ve funkci onClickSwitchActivity(), která je vyvolána po kliknutí na tlačítko, změňte způsob, jakým se volá druhá aktivita, tak, aby očekávala výsledek:

java
public void onClickSwitchActivity(View view) {
EditText editText = (EditText)findViewById(R.id.editTextData); String text = editText.getText().toString(); Intent intent = new Intent(this, SecondActivity.class); intent.putExtra(Intent.EXTRA_TEXT, text); startActivityForResult(intent, 1); }

Následně přidejte metodu onActivityResult(), která bude sloužit k příjmu výsledku z druhé aktivity:

java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { Toast.makeText(this, Integer.toString(data.getIntExtra(REQUEST_RESULT, 0)), Toast.LENGTH_LONG).show(); } }

Nakonec v souboru SecondActivity.java přidejte kód pro nastavení návratového výsledku před zavřením aktivity. Například můžete vrátit pevně danou hodnotu:

java
public void onClickClose(View view) {
Intent returnIntent = new Intent(); returnIntent.putExtra(MainActivity.REQUEST_RESULT, 42); setResult(RESULT_OK, returnIntent); finish(); }

V tomto příkladu metoda onActivityResult() zobrazuje výsledek, který byl vrácen druhou aktivitou, ale důležité je si uvědomit, že při větším počtu aktivit by bylo užitečné zkontrolovat také hodnotu requestCode, aby bylo možné správně identifikovat, která aktivita vrací výsledek.

Tento proces je vcelku jednoduchý, ale je třeba věnovat pozornost několika detailům. Jedním z nich je kontrola resultCode, která zajistí, že výsledek pochází z dokončené akce a ne z jejího zrušení. I když v našem příkladu není tlačítko pro zrušení ve druhé aktivitě, je dobré mít na paměti, že uživatel může kliknout na zpět, čímž by mohl způsobit, že systém vrátí RESULT_CANCEL.

Při práci s výstupy také doporučujeme využívat Toast, což je skvělý nástroj pro zobrazení krátkých zpráv, které nevyžadují extra prostor na obrazovce a jsou snadné pro implementaci. Kromě toho je Toast užitečným nástrojem i pro ladění aplikací.

Pokud máte více aktivit, můžete requestCode využít k identifikaci, odkud konkrétní požadavek přišel. Tento kód slouží jako identifikátor pro různé scénáře v aplikacích, které zahrnují více aktivit. Když je metoda startActivityForResult() volána s negativním requestCode, bude se chovat stejně, jako by byla použita metoda startActivity(), a nebude vracet žádný výsledek.

Chcete-li, aby aplikace správně reagovala na změny stavu, je důležité implementovat mechanismus pro uložení a obnovení stavu aktivity. Mobilní zařízení mají omezené prostředky, a uživatelé často přepínají mezi aplikacemi nebo čelí přerušení, například při příjmu telefonního hovoru. Pokud systém zabije vaši aplikaci, aby uvolnil paměť, je důležité, aby vaše aplikace dokázala obnovit svůj stav na místě, kde byla přerušena.

Android poskytuje zpětné volání, které vám umožní uložit stav aplikace, když dojde k její přerušení. K tomu slouží metody onSaveInstanceState() a onRestoreInstanceState(), které vám umožní uložit důležitá data, například hodnotu čítače, a obnovit je po restartu aplikace. Tím zajistíte plynulý a plynulý zážitek pro uživatele.

Pokud jde o implementaci těchto metod, začněte přidáním globální proměnné pro sledování hodnoty čítače a klíče pro ukládání a obnovování tohoto stavu:

java
static final String KEY_COUNTER = "COUNTER";
private int mCounter = 0;

Poté přidejte kód pro inkrementaci čítače při každém stisknutí tlačítka a zobrazení aktuální hodnoty na obrazovce:

java
public void onClickCounter(View view) {
mCounter++; ((TextView)findViewById(R.id.textViewCounter)).setText("Counter: " + Integer.toString(mCounter)); }

Dále implementujte metody pro ukládání a obnovování stavu:

java
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); outState.putInt(KEY_COUNTER, mCounter); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mCounter = savedInstanceState.getInt(KEY_COUNTER); }

Důležité je mít na paměti, že Android bude aktivity často ničit a znovu vytvářet v důsledku změn orientace obrazovky nebo přepnutí mezi aplikacemi. Tento mechanismus se děje automaticky, ale vy je třeba reagovat na tyto změny, aby uživatel nemusel začínat znovu každou interakci, pokud došlo k přerušení.

Jak posílat a přijímat SMS v Androidu: povolení, multipart zprávy a notifikace doručení

Metoda sendTextMessage() je klíčová pro odesílání SMS zpráv v Androidu. Většina kódu kolem této funkce je však věnována správě oprávnění, protože od verze Android 6.0 Marshmallow (API 23) došlo k zásadním změnám v modelu oprávnění. Pro úspěšné odeslání SMS je tedy nezbytné nejdříve zkontrolovat a případně uživatele vyzvat k udělení potřebných oprávnění, přičemž manifest deklarace oprávnění už nestačí.

Maximální délka jedné SMS zprávy je obvykle 160 znaků, ale často se setkáme s potřebou odeslat delší text. K tomu slouží metoda divideMessage() třídy SmsManager, která rozdělí dlouhou zprávu na několik částí a vrátí je v seznamu, který lze následně odeslat pomocí sendMultipartTextMessage(). Přestože by to mělo fungovat obecně, při testování na emulátoru mohou být problémy, a proto je vhodné provádět testování na reálném zařízení.

Pro sledování stavu odeslaných zpráv lze využít dva volitelné parametry metody sendTextMessage(): sentIntent a deliveryIntent, což jsou PendingIntent objekty, které umožní aplikaci reagovat na úspěšné odeslání nebo doručení SMS. V rámci zpětné vazby je možné získat kód výsledku (např. Activity.RESULT_OK nebo chybové kódy jako RESULT_ERROR_NO_SERVICE), což umožňuje podrobnější správu stavu komunikace.

Přijímání SMS zpráv se v Androidu realizuje pomocí Broadcast Receiveru, který reaguje na systémový intent android.provider.Telephony.SMS_RECEIVED. Aplikace nemusí být aktivní, aby přijala SMS; systém ji může spustit, aby zprávu zpracovala. V manifestu je nutné deklarovat příslušná oprávnění a registraci přijímače. V metodě onReceive() se z intentu získá PDU (Protocol Data Unit), což je binární formát zprávy, který se následně převede na SmsMessage objekt. Tento objekt poskytuje přístup k textu zprávy, odesílateli a dalším údajům.

Významnou roli hraje i kontrola a žádost o oprávnění za běhu aplikace, zvláště u Androidu 6.0 a novějších verzí. Bez udělení oprávnění RECEIVE_SMS aplikace nemůže zprávy přijímat. Navíc, pokud aplikace nezachytává příchozí SMS, může být příčinou blokace jiná aplikace s vyšší prioritou přijímače. V takovém případě lze zkusit zvýšit prioritu ve filtraci intentů nebo jinou aplikaci deaktivovat.

Kromě přijímání nových zpráv lze přistupovat i k existujícím SMS uloženým v telefonu přes SMS content provider. Pro tento účel je vyžadováno oprávnění READ_SMS. Pomocí ContentResolveru lze získat kurzor nad uloženými zprávami, které obsahují řadu informací – od ID zprávy, přes číslo odesílatele, datum, až po samotný obsah textu. Tyto data lze využít například pro zobrazení historie zpráv nebo jejich další zpracování.

Pro správnou funkčnost a bezpečnost SMS komunikace je důležité chápat nejen správu oprávnění a metody odesílání a přijímání zpráv, ale také mechanismy doručení a možnosti práce s více částmi zpráv. Bezpečnostní model Androidu a jeho pravidla pro práci s citlivými daty jsou zde zásadní, zejména vzhledem k tomu, že SMS může obsahovat důležité a soukromé informace. Proto je nezbytné věnovat pozornost správnému ošetření oprávnění a možným chybovým stavům, které mohou nastat během odesílání i přijímání SMS.

Důležité je také uvědomit si, že práce s PDU formátem, i když je skryta za API, může být ovlivněna verzí Androidu, což znamená, že kód musí být kompatibilní s různými verzemi systému a vyhodnocovat aktuální prostředí. Testování na reálných zařízeních je tedy nevyhnutelné. V neposlední řadě je třeba vzít v potaz možné konflikty s jinými aplikacemi, které rovněž zachytávají SMS zprávy, což může komplikovat správné fungování vlastního řešení.

Jak správně implementovat knihovnu Volley pro internetové požadavky v Androidu?

V systému Android existuje několik knihoven pro provádění internetových požadavků, mezi které patří Apache HttpClient a HttpURLConnection. Apache HttpClient byla doporučená knihovna do verze Androidu 2.3 Gingerbread (API 9). S verzí 2.3 byla knihovna HttpURLConnection vylepšena a od té doby se stala doporučeným řešením pro práci s internetovými požadavky. V Androidu 6.0 byla knihovna Apache HttpClient zcela odstraněna, což znamenalo, že HttpURLConnection se stala jedinou podporovanou knihovnou. I když HttpURLConnection stále plní svou roli, má své nevýhody – především složitost použití a potřebu psaní mnoha opakujících se částí kódu.

V reakci na tuto složitost byla vyvinuta knihovna Volley, kterou vytvořil Ficus Kirkpatrick, vývojář Google. Tato knihovna nabízí zjednodušený obal pro práci s internetovými požadavky, přičemž pod kapotou používá právě HttpURLConnection, ale zároveň poskytuje řadu užitečných funkcí, které usnadňují práci s internetovými daty. Kromě HttpURLConnection může být Volley využíváno i s jinými knihovnami pro požadavky, pokud to situace vyžaduje.

Významné výhody používání Volleya oproti HttpURLConnection zahrnují:

  • Thread pool (výchozí počet vláken je čtyři): Tento mechanismus zajišťuje, že požadavky budou prováděny asynchronně a efektivně, což je výhodné pro aplikace, které provádějí více požadavků současně.

  • Transparentní disková cache: Volley automaticky ukládá odpovědi na disk, což umožňuje efektivnější práci s daty, zejména pokud jsou opakovaně používána.

  • Nastavení priority fronty požadavků: Umožňuje kontrolovat, jakým způsobem jsou požadavky zpracovávány podle jejich priority.

  • Méně kódu: Na rozdíl od HttpURLConnection není nutné psát opakující se kód pro zachytávání chyb a kontrolu odpovědí, protože Volley tuto část práce vyřizuje automaticky.

Jedním z hlavních důvodů, proč je knihovna Volley tak užitečná, je právě její schopnost výrazně zjednodušit kód při práci s internetovými požadavky. Umožňuje programátorovi soustředit se na specifické úkoly, místo toho, aby se musel zabývat všemi detaily týkajícími se zpracování požadavků. Mimo to, Volley nativně podporuje několik typů požadavků, jako jsou požadavky na řetězce (String), JSON data, obrázky a vlastní typy dat.

Kromě toho je však třeba si být vědom i omezení Volleya. I když je vynikající pro zpracování malých a středně velkých požadavků, například při načítání dat pro zobrazení v ListView, není ideální pro stahování velkých souborů, protože objekty odpovědí jsou načítány do paměti. V těchto případech je lepší použít knihovnu DownloadManager, která je speciálně navržena pro efektivní stahování větších souborů. Pro streamování obsahu, například videí, je naopak lepší využít přímo HttpURLConnection, protože Volley není pro tento účel optimalizováno.

Pokud chcete začít používat knihovnu Volley ve svém Android projektu, musíte si ji nejprve stáhnout a přidat do svého projektu. K tomu je potřeba stáhnout soubory knihovny z oficiálního repozitáře Android Open Source Project (AOSP) pomocí Git příkazu: git clone https://android.googlesource.com/platform/frameworks/volley.

Po stažení knihovny přidejte její soubory do svého Android Studio projektu a upravte související konfigurace. Následující kroky ukazují, jak přidat knihovnu do vašeho projektu a jak vytvořit jednoduchý požadavek na internetové stránky, který bude následně zobrazen na obrazovce aplikace.

Pro začátek je potřeba v manifestu aplikace přidat povolení pro přístup k internetu, což je základní krok pro jakýkoli internetový požadavek. Poté je nutné importovat knihovnu Volley do projektu a upravit konfiguraci souboru build.gradle tak, aby zahrnoval závislost na knihovnu Volley.

Po správném nastavení projektu, můžete začít vytvářet jednoduché požadavky pomocí Volleye. Například můžete vytvořit StringRequest pro získání textového odpovědi z webové stránky a následně tento text zobrazit v TextView vaší aplikace. Kód pro tento požadavek může vypadat například takto:

java
public void sendRequest(View view) {
final TextView textView = (TextView) findViewById(R.id.textView);
RequestQueue queue = Volley.newRequestQueue(this);
String url = "https://www.packtpub.com/";
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override
public void onResponse(String response) {
textView.setText(response.substring(
0, 500)); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { textView.setText("onErrorResponse(): " + error.getMessage()); } }); queue.add(stringRequest); }

Tento jednoduchý příklad ukazuje, jak vytvořit požadavek na webovou stránku a následně zpracovat odpověď. Při použití Volleya je celý proces efektivní a vyžaduje minimální konfiguraci.

Pokud v aplikaci potřebujete zrušit nějaký požadavek, například při rychlém scrollování v seznamu, kdy už není potřeba čekat na odpověď, Volley vám poskytuje mechanismus pro zrušení požadavků z fronty. To je důležité pro šetření prostředků, jako je šířka pásma, energie a CPU.

Jak správně uchovávat a obnovovat data v aplikacích pro Android

V procesu vývoje aplikací pro Android se vývojáři často setkávají s potřebou uchovávat a obnovovat stav aplikace při různých událostech, jako je změna orientace obrazovky nebo přechod mezi aktivitami. Android poskytuje několik mechanismů pro správu tohoto stavu, mezi něž patří metody jako onSaveInstanceState() a onRestoreInstanceState(), stejně jako mechanismus pro trvalé uchovávání dat pomocí SharedPreferences.

V rámci třetího kroku, který se zaměřuje na samotné ukládání a obnovování dat, je důležité věnovat pozornost metodám, které jsou v tomto procesu klíčové. Systém posílá objekt Bundle, což je datová struktura obsahující páry jméno/hodnota. Tento objekt je předáván metodám onSaveInstanceState() a onRestoreInstanceState(), které zajišťují, že data jsou zachována a následně obnovena. Při pokusu o zadání textu do pole EditText před otočením zařízení byste si mohli všimnout, že text je automaticky obnoven, ačkoli není k dispozici žádný vlastní kód pro jeho správu. Důvodem je, že systém automaticky uchovává stav, pokud má daný prvek unikátní identifikátor (ID). Bez něj však stav nebude uložen. Pokud například používáme prvek TextView, jeho stav se neukládá automaticky, ale můžeme jej manuálně uchovat.

Existuje však i jiný způsob obnovy stavu, který může být užitečný v případě, kdy není k dispozici metoda onRestoreInstanceState(). Obě metody, onCreate() a onRestoreInstanceState(), přijímají stejný objekt Bundle, což umožňuje přesunout kód pro obnovu stavu do metody onCreate(). Tento přístup funguje stejně jako metoda onRestoreInstanceState(), ale je třeba mít na paměti, že pokud není dostupný žádný uložený stav (například při prvotním vytvoření aktivity), bude savedInstanceState hodnota null. V takovém případě je nezbytné zajistit kontrolu, zda data existují, než se je pokusíme obnovit.

Kromě tohoto dočasného ukládání dat na úrovni aktivity, které se uplatňuje při změně orientace nebo přechodu mezi aktivitami, existuje i možnost ukládat data mezi různými relacemi aplikace. K tomu slouží trvalé úložiště v podobě SharedPreferences. Tento mechanismus je ideální pro uchovávání jednoduchých dat, jako jsou preference uživatele nebo skóre, která je potřeba zachovat i po zavření aplikace. Ukládání dat pomocí SharedPreferences je velmi jednoduché a skládá se z několika základních kroků, jak ukazuje následující příklad.

Nejprve je třeba přidat metodu onPause(), která zajistí, že data budou uložena před uzavřením aktivity. K tomu slouží objekt SharedPreferences.Editor, který umožňuje přidávat, upravovat a odstraňovat hodnoty. Po změně hodnoty je nezbytné zavolat metodu commit(), která skutečně provede uložení dat.

Dále je třeba přidat kód pro obnovení hodnot při opětovném vytvoření aktivity, obvykle v metodě onCreate(). Zde je nutné zkontrolovat, zda existují uložena data, která mohou být obnovena. Pokud data existují, použije se metoda getInt() pro načtení hodnoty. Tento přístup lze snadno rozšířit na různé datové typy, jako jsou řetězce, booleovské hodnoty nebo jiná čísla.

Pokud je potřeba uložit více než jednu sadu preferencí, lze využít metodu getSharedPreferences(), která umožňuje práci s více soubory preferencí. K tomu je třeba specifikovat název souboru a režim přístupu (například MODE_PRIVATE).

Je však důležité pochopit, že Android spravuje životní cyklus aktivit přísně, zejména na platformách, které běží na baterie. To znamená, že aktivita může být vyřazena z paměti bez varování, pokud systém potřebuje uvolnit prostředky. Proto je nezbytné rozumět životnímu cyklu aktivity a správně reagovat na různé stavy, ve kterých se aktivita může nacházet. Aktivita může být aktivní, pozastavená nebo zastavená, a na základě toho by měla být spravována jak uživatelská rozhraní, tak i data.

Pochopení životního cyklu aktivit je nezbytné pro správné fungování aplikace. Například, když aktivita přechází do pozastaveného stavu (například při přechodu na jinou aktivitu), měla by se správně uvolnit a zachovat svůj stav pro pozdější obnovení. Pokud je aktivita zcela zastavena nebo zničena, je nutné se postarat o čištění prostředků.

Důležitým faktorem je i správná manipulace s výjimkami a kontrola null hodnot při obnovování dat. Ačkoli většina operací s daty je poměrně jednoduchá, nezbytné je mít na paměti, že různé scénáře (například změna orientace nebo přechod mezi aktivitami) mohou mít vliv na to, jak jsou data obnovována.