onRestart — az Activity életciklus metódusa Androidban, amelyet a rendszer az Activity Stopped állapotból Started állapotba való visszatérése előtt hív meg. Az onRestart jelzi, hogy az Activity, amelyet korábban egy másik képernyő elrejtett vagy a háttérbe minimalizált, újra láthatóvá válik a felhasználó számára. Az onRestart-ban a fejlesztő frissíti az elavult adatokat, újratölti a listákat és helyreállítja az UI-állapotot, amely megváltozhatott, amíg az Activity láthatatlan volt. A Google Android Vitals (2025) szerint az onRestart-ot adatfrissítésre használó alkalmazások 25%-kal kevesebb helytelen információmegjelenítési esetet mutatnak a képernyőre való visszatéréskor. Android Developers dokumentáció az onRestart-ot előkészítő szakaszként írja le, mielőtt az Activity újra megjelenne a képernyőn.
Főbb pontok
onRestart — egy callback metódus, amelyet Android az onStart előtt hív meg, amikor az Activity visszatér a láthatatlan Stopped állapotból a látható állapotba. Ez a metódus egyedi, mert csak az Activity ismételt megjelenítésekor hívódik meg — az első példány létrehozásakor a sorozat az onCreate-tel kezdődik, kihagyva az onRestart-ot. Teljes ciklus: onCreate → onStart → onResume (első indítás) vagy onRestart → onStart → onResume (ismételt megjelenítés).
Az Android rendszer szempontjából az onRestart egy optimalizálás, amely lehetővé teszi az Activity számára, hogy felkészüljön a visszatérésre: frissítse az adatokat a repositoryból, szinkronizálja az UI-állapotot, ellenőrizze a hálózati kapcsolatot. Ellentétben az onResume-mal, amely minden egyes fókusz megszerzésekor meghívódik (beleértve a párbeszédablakból vagy rendszermenüből való visszatérést is), az onRestart csak a teljes elrejtés-visszatérés ciklusban aktiválódik. Ez teszi az onRestart-ot ideális hellyé a „nehéz“ frissítési műveletek számára, amelyek nem szükségesek részleges fókuszvesztés esetén.
Az Android Activity életciklus specifikációja szerint az onStop és onRestart közötti időintervallum néhány másodperctől (a felhasználó gyorsan váltott) néhány óráig (az alkalmazás a háttérben volt és a felhasználó visszatért) terjedhet. Ez idő alatt a távoli forrásban (API, DB) lévő adatok megváltozhattak, ezért az onRestart természetes pont az aktualitás ellenőrzésére.
Az onRestart csak az Activity Stopped állapotból való visszatérésekor hívódik meg, amelybe az Activity az onStop meghívása után került. Az alábbiakban felsoroljuk az onRestart-hoz vezető összes forgatókönyvet.
Az onRestart meghívásának forgatókönyvei:
Mikor NEM hívódik meg az onRestart: képernyőelforgatáskor (az Activity megsemmisül és az onCreate-en keresztül újra létrejön), párbeszédablakból való visszatéréskor (az Activity nem megy onStop-ba, csak onPause → onResume), process death esetén (az Activity újra létrejön).
Az onRestart és az onCreate két különböző megközelítés az Activity helyreállítására. A választás attól függ, hogy az Activity teljesen megsemmisült vagy csak elrejtették.
| Jellemző | onRestart | onCreate |
|---|---|---|
| Mikor hívódik meg | Az Activity visszatér a Stopped-ból | Az Activity első alkalommal vagy megsemmisítés után jön létre |
| Állapot mentve | Igen — ViewModel és mezők élnek | Nem — minden újra létrejön |
| Bundle | Nem kerül továbbításra | Továbbításra kerül (savedInstanceState) |
| Tipikus műveletek | Adatfrissítés, UI frissítése | View inicializálása, LiveData feliratkozás |
| Meghívás gyakorisága | Minden visszatéréskor | Egyszer vagy megsemmisítés után |
Választási szabály: a View inicializálását és a LiveData/StateFlow-ra való feliratkozást az onCreate-ben (vagy Fragment esetén onViewCreated-ben) végezze. Az adatok frissítését, listák újratöltését és állapotellenőrzést — az onRestart-ban. Ha az adatok ViewModel-en keresztül töltődnek be, az onRestart egyszerűen meghívhatja a refresh() metódust a ViewModel-en, a View pedig feliratkozik a frissített adatokra a reaktív folyamon keresztül.
A Google azt ajánlja: ne duplikálja az onCreate logikáját az onRestart-ban. Különítse el a ViewModel-ben a refresh() metódusokat, amelyek az aktuális adatokat töltik be, és hívja meg őket az onRestart-ban. Ez megőrzi az MVVM architektúra tisztaságát és kiküszöböli a kódismétlést.
Az onRestart — ideális hely azon műveletek számára, amelyeket minden egyes képernyőre való visszatéréskor végre kell hajtani, de az első megnyitáskor nem szükségesek. Íme a tipikus forgatókönyvek:
viewModel.refreshItems() metódust az onRestart-ban.Mit NE tegyen az onRestart-ban: ne inicializálja újra a View-kat — élnek, mert az Activity nem semmisült meg. Ne iratkozzon fel újra a LiveData-ra — a feliratkozás az onCreate-ben él. Ne hozzon létre új fragmenteket — már a FragmentManager-ben vannak.
A legfontosabb kivétel: az onRestart nem hívódik meg, ha az alkalmazás folyamatát a rendszer megölte. Ez az a kulcsfontosságú pont, amelyet a fejlesztők gyakran elmulasztanak, az onRestart-ra támaszkodva az állapot helyreállításához.
Process death esetén:
Hogyan védekezzen: mindig mentse el a kritikus állapotot az onSaveInstanceState(Bundle) metódusban (az onStop előtt hívódik meg), vagy használja a SavedStateHandle-et a ViewModel-ben. Az onCreate-ben ellenőrizze a savedInstanceState-et: ha nem null, állítsa vissza az állapotot a Bundle-ből, ha null — töltsön be friss adatokat.
A Google Android Vitals szerint az Activity-hez való visszatérések körülbelül 7%-a történik a háttérben való hosszú tartózkodás után process death következtében. Ez azt jelenti, hogy minden 15. Activity, amelynek meg kellett volna hívnia az onRestart-ot, valójában az onCreate-en megy keresztül. Ennek a forgatókönyvnek a figyelmen kívül hagyása az „üres képernyő visszatérés után“ hibák egyik fő oka.
Az Activity meghívja a viewModel.refreshTasks() metódust az onRestart-ban a feladatlista frissítéséhez a szerkesztőképernyőről való visszatérés után.
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", "${tasks.size} feladat érkezett")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: feladatlista frissítése")
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()
}
}
}
A ViewModel.refreshTasks() betölti az aktuális adatokat a repositoryból. A LiveData automatikusan értesíti az Activity-t az adatok változásáról — az UI további kód nélkül frissül. Az OnRestart nem hoz létre új feliratkozást — az már az onCreate-ben be van állítva.
Az Activity ellenőrzi a token érvényességét visszatéréskor, és szükség esetén átirányít a bejelentkezési képernyőre.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Visszatértünk a bejelentkezési képernyőről") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Token lejárt — átirányítás a bejelentkezésre")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Ha a felhasználó hosszú időre minimalizálta az alkalmazást, és a token lejárta után tért vissza, az onRestart átirányítja a bejelentkezési képernyőre. Ez megakadályozza az API-hibákat, amikor lejárt tokenű kérést próbál végrehajtani. Figyelem: ellenőrzés az onRestart-ban, nem az onResume-ban, hogy elkerülje a szükségtelen ellenőrzést a párbeszédablakból való visszatéréskor.
A Fragment az onRestart-ot a LifecycleObserver-en keresztül használja az adatfrissítéshez.
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 LifecycleObserver-en keresztül")
viewModel.refreshFeed()
}
})
}
}
Az onRestart Fragment-ben történő felülírása helyett LifecycleObserver-t használunk — egy rugalmasabb megközelítés, amely lehetővé teszi logika hozzáadását az életciklus-eseményekhez öröklődés nélkül. A ViewLifecycleOwner garantálja, hogy a megfigyelő a View hatókörében él (nem éli túl az onDestroyView-t).
Gyakran Ismételt Kérdések
Az onResume minden alkalommal meghívódik, amikor az Activity fókuszt kap — beleértve a párbeszédablakból vagy rendszermenüből való visszatérést is (az Activity nem ment onStop-ba). Az onRestart csak a Stopped állapotból való visszatéréskor hívódik meg, amikor az Activity teljesen rejtve volt. Az onRestart szűkebb esemény a „nehéz“ frissítésekhez, az onResume a könnyű műveletekhez (cím módosítása, idő frissítése).
Nem, nem hívható meg. Az onRestart az onStop párja: az onRestart csak azután hívódik meg, hogy az Activity átesett az onStop-on. Ha az Activity nem ment onStop-ba (pl. párbeszédablak van nyitva), akkor visszatéréskor az onRestart nem hívódik meg — csak onResume.
Nyomja meg a Home (házikó) gombot az emulátorban — az Activity minimalizálódik, onStop-ot kap. Ezután nyissa meg az alkalmazást a Recent Apps vagy a launcher segítségével — az Activity onRestart → onStart → onResume-t kap. Hibakereséshez használja a Debug módot töréspontokkal az onRestart-ban vagy a Log.d-t Activity címkével.
Az onRestart-ban elkapott kivétel Force Close-t okoz. A rendszer nem fogja el a kivételeket az életciklus callback-ekben. Ha az onRestart-ban olyan műveleteket hajt végre, amelyek kivételt dobhatnak (hálózati kérés try-catch nélkül, munka null View-val), csomagolja be őket try-catch-be.
Nem. Az onRestart csak a Stopped állapotból visszatérő élő Activity-k esetén hívódik meg. Az isFinishing() az onRestart-ban mindig false lesz. Az isFinishing() ellenőrzésének az onPause-ban (adatok mentése) és az onDestroy-ban (újralétrehozás megkülönböztetése a finish()-től) van értelme.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is