onRestart — podstata, obnovení Activity v životním cyklu

Autor: IT Sectr Publikováno: 2026-03-04 Doba čtení: 8 min

onRestart — metoda životního cyklu Activity v Androidu, volaná systémem před návratem Activity ze stavu Stopped do stavu Started. onRestart signalizuje, že Activity, dříve skryté jinou obrazovkou nebo minimalizované na pozadí, se opět stává viditelným pro uživatele. V onRestart vývojář aktualizuje zastaralá data, znovu načítá seznamy a obnovuje stav UI, který se mohl změnit, dokud bylo Activity neviditelné. Podle Google Android Vitals (2025) vykazují aplikace používající onRestart pro aktualizaci dat o 25% méně případů nesprávného zobrazení informací při návratu na obrazovku. Dokumentace Android Developers popisuje onRestart jako přípravnou fázi před tím, než se Activity znovu objeví na obrazovce.

Hlavní body

  • onRestart je volán při návratu Activity ze stavu Stopped, před onStart a onResume.
  • onRestart není volán při prvním vytvoření Activity — pouze při opakovaném zobrazení po skrytí.
  • Hlavním úkolem onRestart je aktualizovat data, která se mohla změnit, dokud bylo Activity neviditelné.
  • onRestart není volán při process death — v tomto případě je Activity vytvořeno znovu přes onCreate.
  • Správné použití onRestart zlepšuje uživatelský zážitek při multitaskingu a přepínání mezi aplikacemi.

onRestart — podstata metody v životním cyklu Androidu

onRestart — metoda callback, kterou Android volá striktně před onStart, když se Activity vrací z neviditelného stavu Stopped zpět do viditelného. Tato metoda je jedinečná tím, že je volána pouze při opakovaném zobrazení Activity — při prvním vytvoření instance sekvence začíná onCreate, přičemž onRestart je přeskočen. Celý cyklus: onCreate → onStart → onResume (první spuštění) nebo onRestart → onStart → onResume (opakované zobrazení).

Z pohledu systému Android je onRestart optimalizace, která umožňuje Activity připravit se na návrat: aktualizovat data z repozitáře, synchronizovat stav UI, zkontrolovat připojení k síti. Na rozdíl od onResume, který je volán pokaždé při získání fokusu (včetně návratu z dialogu nebo systémové nabídky), onRestart se aktivuje pouze při úplném cyklu skrytí-návrat. To činí onRestart ideálním místem pro „těžké“ operace aktualizace, které nejsou potřeba při částečné ztrátě fokusu.

Podle specifikace životního cyklu Android Activity může časový interval mezi onStop a onRestart činit od několika sekund (uživatel rychle přepnul) do několika hodin (aplikace byla na pozadí a uživatel se vrátil). Během této doby se data ve vzdáleném zdroji (API, DB) mohla změnit, proto je onRestart přirozeným bodem pro kontrolu aktuálnosti.

Kdy je onRestart volán: podmínky a pořadí

onRestart je volán pouze při návratu Activity ze stavu Stopped, do kterého Activity přešlo po volání onStop. Níže jsou uvedeny všechny scénáře vedoucí k onRestart.

Scénáře volání onRestart:

  • Návrat z jiného Activity — uživatel otevřel nové Activity (např. klikl na oznámení) a poté se vrátil (stiskl „Zpět“). Zásobník: MainActivity.onPause → MainActivity.onStop → SecondActivity je vytvořeno → uživatel stiskne „Zpět“ → SecondActivity.onPause → SecondActivity.onStop → SecondActivity.onDestroy → MainActivity.onRestart → MainActivity.onStart → MainActivity.onResume.
  • Návrat z minimalizace — uživatel minimalizoval aplikaci (Home) a po nějaké době se vrátil. CurrentActivity.onPause → CurrentActivity.onStop → (aplikace na pozadí) → uživatel se vrací → CurrentActivity.onRestart → CurrentActivity.onStart → CurrentActivity.onResume.
  • Návrat z uzamčené obrazovky — uzamčená obrazovka zakrývá Activity; po odemčení Activity obdrží onRestart, pokud uplynula významná doba (více než 5 sekund).
  • Návrat z aplikace spuštěné přes Intent — fotoaparát, galerie, prohlížeč — jakákoli aplikace třetí strany spuštěná přes startActivityForResult() nebo ActivityResultLauncher.

Kdy onRestart NENÍ volán: při otočení obrazovky (Activity je zničeno a znovu vytvořeno přes onCreate), při návratu z dialogového okna (Activity nejde do onStop, pouze onPause → onResume), při process death (Activity je vytvořeno znovu).

Rozdíl mezi onRestart a onCreate: co zvolit

onRestart a onCreate jsou dva různé přístupy k obnovení Activity. Volba mezi nimi závisí na tom, zda bylo Activity zcela zničeno nebo pouze skryto.

VlastnostonRestartonCreate
Kdy je volánActivity se vrací ze StoppedActivity je vytvořeno poprvé nebo po zničení
Stav uloženAno — ViewModel a pole žijíNe — vše je vytvořeno znovu
BundleNení předávánJe předáván (savedInstanceState)
Typické akceAktualizace dat, obnovení UIInicializace View, přihlášení k LiveData
Frekvence voláníPokaždé při návratuJednou nebo po zničení

Pravidlo výběru: inicializaci View a přihlášení k LiveData/StateFlow provádějte v onCreate (nebo onViewCreated pro Fragment). Aktualizaci dat, opětovné načtení seznamů a kontrolu stavu — v onRestart. Pokud jsou data načítána přes ViewModel, onRestart může jednoduše zavolat metodu refresh() na ViewModel a View se přihlásí k aktualizovaným datům přes reaktivní tok.

Google doporučuje: nezdvojujte logiku onCreate v onRestart. Vyčleňte do ViewModel metody refresh(), které načítají aktuální data, a volejte je v onRestart. To zachovává čistotu architektury MVVM a eliminuje duplicitu kódu.

Scénáře použití onRestart: aktualizace dat a UI

onRestart — ideální místo pro operace, které by měly být provedeny při každém návratu na obrazovku, ale nejsou potřeba při prvním otevření. Zde jsou typické scénáře:

  • Aktualizace seznamu z DB nebo API — uživatel přešel do jiného Activity, tam změnil data, vrátil se — seznam musí být aktuální. Volejte viewModel.refreshItems() v onRestart.
  • Kontrola autorizace — pokud bylo Activity skryto delší dobu, přístupový token mohl vypršet. onRestart je bod pro kontrolu platnosti tokenu a přesměrování na přihlašovací obrazovku.
  • Synchronizace stavu UI — přepínání motivů, změna jazyka, aktualizace nastavení — změny by se měly projevit při návratu na obrazovku.
  • Opětovné načtení médií — pokud Activity zobrazuje obsah, který se mohl změnit (zpravodajský kanál, kurz měn, počasí), aktualizujte data v onRestart.
  • Kontrola síťového připojení — při návratu z offline režimu by Activity mělo zkontrolovat dostupnost sítě a přepnout UI.
  • Obnovení animací — animace uvolněné v onStop znovu spusťte v onRestart před onStart.

Co nedělat v onRestart: neinicializujte View znovu — žijí, protože Activity nebylo zničeno. Nepřihlašujte se znovu k LiveData — přihlášení v onCreate žije. Nevytvářejte nové fragmenty — jsou již ve FragmentManager.

onRestart a process death: důležitá výjimka

Nejdůležitější výjimka: onRestart není volán, pokud byl proces aplikace zabit systémem. To je klíčový moment, který vývojáři často opomíjejí, spoléhajíce na onRestart pro obnovení stavu.

Při process death:

  • Aplikace byla na pozadí, Android zabil proces pro uvolnění paměti.
  • Uživatel se vrací — systém spouští nový proces.
  • Activity je vytvořeno znovu: onCreate(Bundle) → onStart → onResume.
  • onRestart NENÍ volán — pro systém se jedná o novou instanci Activity.

Jak se proti tomu chránit: vždy ukládejte kritický stav do onSaveInstanceState(Bundle) (volá se před onStop) nebo používejte SavedStateHandle ve ViewModel. V onCreate kontrolujte savedInstanceState: pokud není null, obnovte stav z Bundle, pokud je null — načtěte čerstvá data.

Podle Google Android Vitals přibližně 7% návratů k Activity po delším pobytu na pozadí nastává po process death. To znamená, že každé 15. Activity, které mělo zavolat onRestart, ve skutečnosti prochází onCreate. Ignorování tohoto scénáře je jednou z hlavních příčin chyb „prázdná obrazovka po návratu“.

Příklady kódu s onRestart v Kotlinu

Příklad 1: onRestart s aktualizací seznamu přes ViewModel

Activity volá viewModel.refreshTasks() v onRestart pro aktualizaci seznamu úkolů po návratu z obrazovky úprav.

kotlin
class TaskListActivity : AppCompatActivity() {
    private val viewModel: TaskViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_task_list)
        viewModel.tasks.observe(this) { tasks ->
            Log.d("TaskList", "Přijato ${tasks.size} úkolů")
        }
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("TaskList", "onRestart: aktualizace seznamu úkolů")
        viewModel.refreshTasks()
    }
}

class TaskViewModel : ViewModel() {
    private val _tasks = MutableLiveData<List<Task>>()
    val tasks: LiveData<List<Task>> get() = _tasks

    fun refreshTasks() {
        viewModelScope.launch {
            _tasks.value = TaskRepository().getAllTasks()
        }
    }
}

ViewModel.refreshTasks() načítá aktuální data z repozitáře. LiveData automaticky upozorní Activity na změnu dat — UI se aktualizuje bez dalšího kódu. OnRestart nevytváří nové přihlášení — je již nastaveno v onCreate.

Příklad 2: onRestart s kontrolou autorizace

Activity kontroluje platnost tokenu při návratu a v případě potřeby přesměruje na přihlášení.

kotlin
class ProfileActivity : AppCompatActivity() {
    private val authManager = AuthManager()
    private val launcher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { Log.d("Profile", "Vrátili jsme se z přihlašovací obrazovky") }

    override fun onRestart() {
        super.onRestart()
        if (!authManager.isTokenValid()) {
            Log.d("Profile", "Token vypršel — přesměrování na přihlášení")
            launcher.launch(Intent(this, LoginActivity::class.java))
        }
    }
}

class AuthManager {
    fun isTokenValid(): Boolean {
        val expiry = SharedPreferencesManager().getTokenExpiry()
        return System.currentTimeMillis() < expiry
    }
}

Pokud uživatel minimalizoval aplikaci na delší dobu a vrátil se po vypršení tokenu, onRestart ho přesměruje na přihlašovací obrazovku. Tím se zabrání chybám API při pokusu o provedení požadavku s prošlým tokenem. Poznámka: kontrola v onRestart, ne v onResume, aby se předešlo zbytečné kontrole při návratu z dialogu.

Příklad 3: onRestart ve Fragmentu s ViewLifecycleOwner

Fragment používá onRestart přes LifecycleObserver pro aktualizaci dat.

kotlin
class FeedFragment : Fragment() {
    private val viewModel: FeedViewModel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_RESTART)
            fun onRestart() {
                Log.d("FeedFragment", "onRestart přes LifecycleObserver")
                viewModel.refreshFeed()
            }
        })
    }
}

Místo přepsání onRestart ve Fragmentu se používá LifecycleObserver — flexibilnější přístup, který umožňuje přidávat logiku k událostem životního cyklu bez dědičnosti. ViewLifecycleOwner zaručuje, že observer žije v rozsahu View (nepřežije onDestroyView).

Často kladené otázky

Čím se onRestart liší od onResume?

onResume je volán pokaždé, když Activity získá fokus — včetně návratu z dialogu nebo systémové nabídky (Activity nešlo do onStop). onRestart je volán pouze při návratu ze stavu Stopped, když bylo Activity zcela skryto. onRestart je užší událost pro „těžké“ aktualizace, onResume pro lehké operace (změna titulu, aktualizace času).

Může být onRestart volán bez onStop?

Ne, nemůže. onRestart je párová metoda k onStop: onRestart je volán pouze poté, co Activity prošlo onStop. Pokud Activity nešlo do onStop (např. je otevřeno dialogové okno), pak při návratu onRestart není volán — pouze onResume.

Jak simulovat onRestart v emulátoru?

Stiskněte Home (tlačítko domečku) v emulátoru — Activity se minimalizuje, obdrží onStop. Poté otevřete aplikaci přes Recent Apps nebo spouštěč — Activity obdrží onRestart → onStart → onResume. Pro ladění použijte Debug s body přerušení v onRestart nebo Log.d s tagem Activity.

Co se stane, když je v onRestart vyvolána výjimka?

Nezachycená výjimka v onRestart způsobí Force Close. Systém nezachycuje výjimky v callbackech životního cyklu. Pokud jsou v onRestart prováděny operace, které mohou vyvolat výjimku (síťový požadavek bez try-catch, práce s null View), obalte je do try-catch.

Je třeba kontrolovat isFinishing() v onRestart?

Ne. onRestart je volán pouze pro živá Activity, která se vracejí ze stavu Stopped. isFinishing() v onRestart bude vždy false. Kontrola isFinishing() má smysl v onPause (ukládání dat) a onDestroy (rozlišení znovuvytvoření od finish()).

Shrnutí

  • onRestart — metoda životního cyklu volaná při návratu Activity ze stavu Stopped, před onStart a onResume.
  • onRestart NENÍ volán při prvním vytvoření Activity — pouze při opakovaném zobrazení po úplném skrytí.
  • Hlavním účelem onRestart je aktualizace zastaralých dat a kontrola stavu (token, síť, nastavení).
  • onRestart není volán při process death — použijte onCreate s Bundle pro obnovení po zabití procesu.
  • Nezdvojujte logiku onCreate v onRestart: inicializaci provádějte v onCreate, aktualizaci v onRestart.
  • Pro Fragment použijte LifecycleObserver na viewLifecycleOwner místo přepsání onRestart.
  • Správná implementace onRestart zlepšuje UX při multitaskingu a zabraňuje zobrazení zastaralých dat.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také