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 — 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.
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:
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).
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.
| Vlastnost | onRestart | onCreate |
|---|---|---|
| Kdy je volán | Activity se vrací ze Stopped | Activity je vytvořeno poprvé nebo po zničení |
| Stav uložen | Ano — ViewModel a pole žijí | Ne — vše je vytvořeno znovu |
| Bundle | Není předáván | Je předáván (savedInstanceState) |
| Typické akce | Aktualizace dat, obnovení UI | Inicializace View, přihlášení k LiveData |
| Frekvence volání | Pokaždé při návratu | Jednou 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.
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:
viewModel.refreshItems() v onRestart.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.
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:
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“.
Activity volá viewModel.refreshTasks() v onRestart pro aktualizaci seznamu úkolů po návratu z obrazovky úprav.
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.
Activity kontroluje platnost tokenu při návratu a v případě potřeby přesměruje na přihlášení.
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.
Fragment používá onRestart přes LifecycleObserver pro aktualizaci dat.
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
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).
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.
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.
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.
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í
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í.
Přečtěte si také