De levenscyclus van een mobiele app bepaalt hoe deze zich gedraagt bij het starten, minimaliseren, terugkeren uit de achtergrond en sluiten. In dit artikel behandelen we App Lifecycle (iOS), Activity Lifecycle (Android), Fragment Lifecycle, ViewController Lifecycle en LifecycleOwner. Het begrijpen van deze processen is cruciaal om geheugenlekken, gegevensverlies en incorrect app-gedrag te voorkomen. Meer details in de officiële Android Activity Lifecycle documentatie.
Belangrijkste punten
Voordat we ingaan op de levenscyclus van individuele schermen, is het belangrijk de levenscyclus van de hele app te begrijpen. In iOS doorloopt de app vijf statussen: Not Running (niet actief), Inactive (op achtergrond, ontvangt geen gebeurtenissen), Active (actief), Background (op achtergrond, code wordt uitgevoerd) en Suspended (op achtergrond, code gepauzeerd). Deze statussen worden beheerd in AppDelegate via de methoden applicationDidFinishLaunching, applicationDidBecomeActive, applicationWillResignActive, applicationDidEnterBackground en applicationWillTerminate.
In Android is het equivalent de Application Lifecycle, bijgehouden via de interface Application.ActivityLifecycleCallbacks. Android richt zich echter meer op de levenscyclus van een Activity — een individueel app-scherm. Dit komt doordat een Android-app uit meerdere Activities kan bestaan, elk met een eigen cyclus.
De moderne aanpak in Android is het gebruik van ProcessLifecycleOwner uit de lifecycle-process bibliotheek. Het maakt het mogelijk de status van het hele proces te volgen zonder gebonden te zijn aan een specifieke Activity. In iOS wordt UISceneDelegate (sinds iOS 13) of AppDelegate gebruikt voor het volgen van de app-status. SceneDelegate beheert meerdere vensters (multiwindow) op iPad. Het begrijpen van de App Lifecycle is vooral belangrijk voor IT Sectr bij het ontwikkelen van apps met achtergrondsynchronisatie, streaming en VoIP-gesprekken.
Activity is de basiscomponent van een Android-app die één scherm vertegenwoordigt. Activity heeft een duidelijk gedefinieerde levenscyclus die wordt beheerd door het besturingssysteem in reactie op gebruikersacties en systeemgebeurtenissen (schermrotatie, inkomend gesprek, weinig geheugen).
| Methode | Beschrijving | Wat te doen |
|---|---|---|
| onCreate | Eenmaal aangeroepen bij het maken van de Activity | UI-initialisatie, findViewById, ViewModel-instelling |
| onStart | Activity wordt zichtbaar | Animaties starten, BroadCastReceiver registreren |
| onResume | Activity krijgt invoerfocus | Camera, sensoren, animaties starten |
| onPause | Activity verliest focus (gedeeltelijk zichtbaar) | Concepten opslaan, animaties stoppen |
| onStop | Activity is niet zichtbaar | Bronnen vrijgeven, updates stoppen |
| onDestroy | Activity wordt vernietigd | Alle referenties opschonen, uitschrijven van LiveData |
| onRestart | Aangeroepen voor onStart na onStop | Herinitialisatie |
Belangrijk: onSaveInstanceState wordt aangeroepen vóór onStop om de tijdelijke status op te slaan. Herstel vindt plaats in onCreate via Bundle savedInstanceState of via SavedStateHandle in ViewModel. Zonder correcte levenscyclusbehandeling verliest de app alle niet-opgeslagen gegevens bij schermrotatie.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("draft", draftText)
}
override fun onDestroy() {
super.onDestroy()
// Отписка от всех подписок
}
}In Jetpack Compose blijft de Activity-levenscyclus ongewijzigd, maar Compose biedt extra hulpmiddelen: Levenscyclusbewuste compositie via LifecycleOwner, LifecycleEventEffect en DisposableEffect voor automatische opschoning van bronnen bij vernietiging.
Fragment in Android leeft binnen een Activity en heeft zijn eigen levenscyclus, die gedeeltelijk overlapt met Activity maar nieuwe methoden toevoegt. Fragmenten kunnen worden toegevoegd, vervangen en verwijderd zonder de Activity te vernietigen, wat ze flexibeler maar ook complexer maakt.
Belangrijkste methoden van Fragment Lifecycle: onAttach — Fragment aan Activity gekoppeld (eerste aanroep); onCreate — gegevensinitialisatie; onCreateView — View-creatie; onViewCreated — View gemaakt, UI kan worden geconfigureerd; onStart — Fragment zichtbaar; onResume — Fragment in focus; onPause — Fragment verliest focus; onStop — Fragment niet zichtbaar; onDestroyView — View vernietigd; onDestroy — Fragment vernietigd; onDetach — Fragment losgekoppeld van Activity.
Belangrijkste verschil met Activity: onCreateView en onDestroyView kunnen meerdere keren worden aangeroepen (bijv. bij het wisselen van TabLayout), terwijl onCreate eenmalig wordt aangeroepen. Dienovereenkomstig moet View-initialisatie plaatsvinden in onViewCreated, niet in onCreateView. View-gerelateerde bronnen (zoals RecyclerView-adapters) moeten worden opgeschoond in onDestroyView.
UIViewController is de basisklasse voor het beheren van schermen in iOS. De levenscyclus bestaat uit een reeks methoden die UIKit automatisch aanroept. Het begrijpen van deze cyclus is cruciaal voor correcte UI-initialisatie, gegevensbeheer en geheugenbeheer.
| Methode | Wanneer aangeroepen | Typisch gebruik |
|---|---|---|
| loadView | Wanneer de View Controller zijn View-hiërarchie laadt | Aangepaste initialisatie zonder storyboard |
| viewDidLoad | Nadat View in geheugen is geladen (eenmalig) | UI-instelling, initiële gegevens laden |
| viewWillAppear | Voordat de View op het scherm verschijnt | Gegevens bijwerken, abonneren op meldingen |
| viewDidAppear | Nadat de View op het scherm is verschenen | Animaties starten, tracking-animaties starten |
| viewWillDisappear | Voordat de View van het scherm verdwijnt | Status opslaan, uitschrijven van meldingen |
| viewDidDisappear | Nadat de View van het scherm is verdwenen | Animaties stoppen, bronnen vrijgeven |
| dealloc | Wanneer de View Controller wordt vernietigd | Alle bronnen vrijgeven |
Belangrijk: viewDidLoad wordt slechts eenmaal aangeroepen in de levensduur van een View Controller. Gebruik viewWillAppear om gegevens bij te werken bij elke verschijning. Als u zich abonneert op NotificationCenter in viewWillAppear, zorg dan dat u uitschrijft in viewDidDisappear om geheugenlekken te voorkomen.
SwiftUI beheert de levenscyclus van Views via View-structuren. In plaats van callback-methoden gebruikt SwiftUI de modifiers onAppear en onDisappear. Voor globale app-statussen wordt de App Lifecycle gebruikt via de App- en Scene-protocollen. SwiftUI beheert automatisch het maken en vernietigen van Views op basis van de status, wat ontwikkeling vereenvoudigt maar begrip van View-identiteit en levensduur vereist.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}LifecycleOwner is een interface van Android Architecture Components die een object markeert met een levenscyclus (Activity, Fragment). LifecycleObserver is een interface die een object in staat stelt zich te abonneren op LifecycleOwner-gebeurtenissen. Samen vormen ze de basis van reactief levenscyclusbeheer in moderne Android-ontwikkeling.
In plaats van methoden expliciet aan te roepen in onStart/onStop, wordt aanbevolen DefaultLifecycleObserver te gebruiken (vervanging voor de verouderde LifecycleObserver met @OnLifecycleEvent-annotaties). Dit is de door Google gepromote aanpak voor ViewModel en andere componenten die moeten reageren op de levenscyclus zonder directe verwijzingen naar Activity of Fragment.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}Bij IT Sectr gebruiken we LifecycleOwner in alle Android-projecten. ViewModel abonneert zich op de LifecycleOwner van Activity via viewModelScope en lifecycleScope, wat automatische annulering van coroutines garandeert wanneer de Activity wordt vernietigd. Dit voorkomt geheugenlekken en maakt de code schoner en veiliger.
Veelgestelde vragen
Activity doorloopt zes statussen: Created (onCreate), Started (onStart), Resumed (onResume), Paused (onPause), Stopped (onStop), Destroyed (onDestroy).
Volgorde: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. viewDidLoad wordt eenmalig aangeroepen.
LifecycleOwner is een component van Android Architecture Components die de levenscyclus van een Activity of Fragment bezit. Maakt abonneren op gebeurtenissen via LifecycleObserver mogelijk.
De iOS-app doorloopt vijf statussen: Not Running, Inactive, Active, Background, Suspended. Overgangen worden beheerd via UIApplicationDelegate.
Saved State is het Android-mechanisme om de Activity/Fragment-status te behouden bij schermrotatie of het opnieuw aanmaken van het proces. Het gebruikt onSaveInstanceState en SavedStateHandle.
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.