onRestart — een methode van de Activity-levenscyclus in Android, aangeroepen door het systeem voordat Activity terugkeert van de Stopped-status naar de Started-status. onRestart geeft aan dat Activity, eerder verborgen door een ander scherm of geminimaliseerd naar de achtergrond, weer zichtbaar wordt voor de gebruiker. In onRestart werkt de ontwikkelaar verouderde gegevens bij, laadt lijsten opnieuw en herstelt de UI-status die mogelijk is gewijzigd terwijl Activity onzichtbaar was. Volgens Google Android Vitals (2025) tonen apps die onRestart gebruiken voor gegevensupdates 25% minder gevallen van onjuiste weergave van informatie bij terugkeer naar het scherm. Android Developers documentatie beschrijft onRestart als een voorbereidende fase voordat Activity weer op het scherm verschijnt.
Belangrijkste punten
onRestart — een callback-methode die Android strikt vóór onStart aanroept, wanneer Activity terugkeert van de onzichtbare Stopped-status naar de zichtbare status. Deze methode is uniek omdat deze alleen wordt aangeroepen bij herhaalde weergave van Activity — bij de eerste instantiecreatie begint de reeks met onCreate, waarbij onRestart wordt overgeslagen. Volledige cyclus: onCreate → onStart → onResume (eerste start) of onRestart → onStart → onResume (herhaalde weergave).
Vanuit het oogpunt van het Android-systeem is onRestart een optimalisatie waarmee Activity zich kan voorbereiden op terugkeer: gegevens uit de repository bijwerken, de UI-status synchroniseren, de netwerkverbinding controleren. In tegenstelling tot onResume, dat elke keer wordt aangeroepen bij het verkrijgen van focus (inclusief bij terugkeer uit een dialoog of het systeemmenu), wordt onRestart alleen geactiveerd bij de volledige cyclus van verbergen-terugkeer. Dit maakt onRestart de ideale plek voor „zware“ update-operaties die niet nodig zijn bij gedeeltelijk focusverlies.
Volgens de specificatie van de Android Activity-levenscyclus kan het tijdsinterval tussen onStop en onRestart variëren van enkele seconden (gebruiker schakelde snel) tot enkele uren (app was op de achtergrond en gebruiker keerde terug). Gedurende deze tijd kunnen gegevens in de externe bron (API, DB) zijn gewijzigd, daarom is onRestart het natuurlijke punt om actualiteit te controleren.
onRestart wordt alleen aangeroepen bij terugkeer van Activity uit de Stopped-status, waarin Activity is gekomen na het aanroepen van onStop. Hieronder staan alle scenario's die tot onRestart leiden.
Scenario's voor het aanroepen van onRestart:
Wanneer onRestart NIET wordt aangeroepen: bij schermrotatie (Activity wordt vernietigd en opnieuw aangemaakt via onCreate), bij terugkeer uit een dialoogvenster (Activity gaat niet naar onStop, alleen onPause → onResume), bij process death (Activity wordt opnieuw aangemaakt).
onRestart en onCreate zijn twee verschillende benaderingen voor het herstellen van Activity. De keuze hangt af van of Activity volledig is vernietigd of alleen verborgen.
| Kenmerk | onRestart | onCreate |
|---|---|---|
| Wanneer aangeroepen | Activity keert terug uit Stopped | Activity wordt voor het eerst of na vernietiging aangemaakt |
| Status bewaard | Ja — ViewModel en velden leven | Nee — alles wordt opnieuw aangemaakt |
| Bundle | Niet doorgegeven | Doorgegeven (savedInstanceState) |
| Typische acties | Gegevens bijwerken, UI verversen | View initialiseren, LiveData abonneren |
| Aanroeptijd | Elke keer bij terugkeer | Eenmalig of na vernietiging |
Keuzeregel: initialiseer View en abonneer op LiveData/StateFlow in onCreate (of onViewCreated voor Fragment). Gegevens bijwerken, lijsten opnieuw laden en status controleren — in onRestart. Als gegevens worden geladen via ViewModel, kan onRestart eenvoudig de methode refresh() op ViewModel aanroepen, en View abonneert zich op de bijgewerkte gegevens via de reactieve stroom.
Google adviseert: dupliceer de logica van onCreate niet in onRestart. Scheid in ViewModel de methoden refresh() die actuele gegevens laden en roep ze aan in onRestart. Dit behoudt de zuiverheid van de MVVM-architectuur en elimineert codeduplicatie.
onRestart — de ideale plek voor bewerkingen die bij elke terugkeer naar het scherm moeten worden uitgevoerd, maar niet nodig zijn bij de eerste opening. Hier zijn typische scenario's:
viewModel.refreshItems() aan in onRestart.Wat niet te doen in onRestart: initialiseer View niet opnieuw — ze leven omdat Activity niet is vernietigd. Abonneer niet opnieuw op LiveData — de abonnement in onCreate leeft. Maak geen nieuwe fragmenten — ze zijn al in FragmentManager.
De belangrijkste uitzondering: onRestart wordt niet aangeroepen als het proces van de app door het systeem is gedood. Dit is het cruciale punt dat ontwikkelaars vaak missen door te vertrouwen op onRestart voor statusherstel.
Bij process death:
Hoe u zich hiertegen beschermt: bewaar altijd kritieke status in onSaveInstanceState(Bundle) (aangeroepen vóór onStop) of gebruik SavedStateHandle in ViewModel. Controleer in onCreate of savedInstanceState: als deze niet null is, herstel status uit Bundle, als deze null is — laad verse gegevens.
Volgens Google Android Vitals vindt ongeveer 7% van de terugkeer naar Activity na langdurige achtergrond plaats na process death. Dit betekent dat elke 15e Activity die onRestart had moeten aanroepen, in werkelijkheid door onCreate gaat. Het negeren van dit scenario is een van de belangrijkste oorzaken van bugs met „leeg scherm na terugkeer“.
Activity roept viewModel.refreshTasks() aan in onRestart om de takenlijst bij te werken na terugkeer van het bewerkingsscherm.
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} taken ontvangen")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: takenlijst bijwerken")
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() laadt actuele gegevens uit de repository. LiveData stelt Activity automatisch op de hoogte van gegevenswijzigingen — de UI wordt bijgewerkt zonder extra code. OnRestart maakt geen nieuw abonnement — deze is al ingesteld in onCreate.
Activity controleert de geldigheid van het token bij terugkeer en stuurt door naar inloggen indien nodig.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Teruggekeerd van inlogscherm") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Token verlopen — doorsturen naar inloggen")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Als de gebruiker de app langdurig heeft geminimaliseerd en terugkeert na het verlopen van het token, stuurt onRestart hem door naar het inlogscherm. Dit voorkomt API-fouten bij het uitvoeren van een verzoek met een verlopen token. Let op: controle in onRestart, niet in onResume, om onnodige controle bij terugkeer uit een dialoog te voorkomen.
Fragment gebruikt onRestart via LifecycleObserver voor gegevensupdate.
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 via LifecycleObserver")
viewModel.refreshFeed()
}
})
}
}
In plaats van onRestart in Fragment te overschrijven, wordt LifecycleObserver gebruikt — een flexibelere benadering waarmee logica kan worden toegevoegd aan levenscyclusgebeurtenissen zonder overerving. ViewLifecycleOwner garandeert dat de observer leeft binnen de View-scope (overleeft onDestroyView niet).
Veelgestelde vragen
onResume wordt elke keer aangeroepen wanneer Activity focus krijgt — inclusief bij terugkeer uit een dialoog of het systeemmenu (Activity ging niet naar onStop). onRestart wordt alleen aangeroepen bij terugkeer uit de Stopped-status, wanneer Activity volledig verborgen was. onRestart is een smaller bereik voor „zware“ updates, onResume voor lichte bewerkingen (titel wijzigen, tijd bijwerken).
Nee, dat kan niet. onRestart is de gepaarde methode van onStop: onRestart wordt alleen aangeroepen nadat Activity door onStop is gegaan. Als Activity niet naar onStop is gegaan (bijvoorbeeld een dialoogvenster is geopend), wordt onRestart bij terugkeer niet aangeroepen — alleen onResume.
Druk op Home (het huisjes-knop) in de emulator — Activity wordt geminimaliseerd, krijgt onStop. Open vervolgens de app via Recent Apps of de launcher — Activity krijgt onRestart → onStart → onResume. Gebruik voor foutopsporing Debug met breekpunten in onRestart of Log.d met de tag Activity.
Een onderschepte uitzondering in onRestart veroorzaakt Force Close. Het systeem vangt geen uitzonderingen in levenscyclus-callbacks. Als in onRestart bewerkingen worden uitgevoerd die een uitzondering kunnen genereren (netwerkaanvraag zonder try-catch, werken met null View), omhul ze dan met try-catch.
Nee. onRestart wordt alleen aangeroepen voor levende Activity die terugkeren uit de Stopped-status. isFinishing() in onRestart zal altijd false zijn. Het controleren van isFinishing() heeft zin in onPause (gegevens opslaan) en onDestroy (onderscheid maken tussen recreëren en finish()).
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook