lifecycleScope — är en inbyggd CoroutineScope från biblioteket androidx.lifecycle, som är kopplad till livscykeln för Activity, Fragment eller vilken LifecycleOwner som helst och automatiskt annullerar korutiner när komponenten förstörs. Enligt Google Android Developers, 2025 gör lifecycleScope det möjligt att säkert starta korutiner kopplade till UI-lagret utan risk för att köra kod efter att Activity eller Fragment har förstörts. Scopen annulleras automatiskt när LifecycleOwner övergår till tillståndet DESTROYED.
Huvudpunkter
lifecycleScope — är en utökningsegenskap på gränssnittet LifecycleOwner (Activity, Fragment, Service) som tillhandahåller en färdig CoroutineScope kopplad till komponentens fulla livscykel. När LifecycleOwner når tillståndet DESTROYED annullerar lifecycleScope automatiskt alla aktiva korutiner.
// I Fragment eller Activity
lifecycleScope.launch {
delay(1000)
showSnackbar("Hej!")
}
Till skillnad från viewModelScope annulleras lifecycleScope vid varje förstöring av LifecycleOwner — inklusive skärmrotation. Detta gör den idealisk för operationer som bara ska leva så länge en specifik skärm är synlig.
lifecycleScope är tillgängligt överallt där det finns en LifecycleOwner:
Mekanismen för automatisk annullering av lifecycleScope är baserad på prenumeration på Lifecycle-händelser. När Lifecycle sjunker under CREATED till DESTROYED annulleras scopen.
| Tillstånd | Beskrivning | Scope aktivt |
|---|---|---|
| CREATED | LifecycleOwner skapad, onCreate utförd | Ja |
| STARTED | LifecycleOwner synlig (onStart) | Ja |
| RESUMED | LifecycleOwner i förgrunden (onResume) | Ja |
| DESTROYED | LifecycleOwner förstörd (onDestroy) | Nej (scope annullerad) |
lifecycleScope skapas som CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) och lagras inuti Lifecycle. När Lifecycle övergår till tillståndet DESTROYED anropas scope.cancel(). Mekanismen implementeras via LifecycleEventObserver, som prenumererar på livscykelhändelser vid första åtkomst till scopen.
Vid skärmrotation förstörs Activity (onDestroy) och skapas på nytt. lifecycleScope annulleras tillsammans med den gamla Activity och en ny instans av scopen skapas för den nya Activity. Detta är en grundläggande skillnad från viewModelScope, som bevaras vid rotation.
Lifecycle-biblioteket erbjuder flera sätt att starta korutiner via lifecycleScope. Låt oss titta på API-utvecklingen från föråldrade metoder till moderna.
Det enklaste sättet — lifecycleScope.launch { ... }. Korutinen startar omedelbart och annulleras vid DESTROYED. Den kan dock köra kod även när UI inte är synligt (t.ex. i bakgrunden efter onStop). Detta är inte alltid önskvärt.
Dessa metoder pausade korutinens exekvering när Lifecycle sjönk under det angivna tillståndet och återupptog vid återkomst. Men de markerades som @Deprecated i lifecycle-runtime-ktx 2.6.0, eftersom:
repeatOnLifecycle — det av Google rekommenderade sättet att starta korutiner synkroniserade med livscykeln. Den annullerar och startar om korutinen varje gång Lifecycle når ett specificerat tillstånd.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect { state ->
updateUI(state)
}
}
}
Korutinen som skickas till repeatOnLifecycle startar när Lifecycle når STARTED och annulleras när den sjunker under STARTED. Vid återkomst till STARTED startas korutinen om från början. Detta är säkert och effektivt — inga korutiner hänger i paus.
För insamling av data från Flow med hänsyn till livscykeln finns operatorn flowWithLifecycle. Den stoppar och återupptar automatiskt insamlingen när Lifecycle-tillståndet ändras:
viewModel.uiState
.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
.onEach { state -> updateUI(state) }
.launchIn(lifecycleScope)
Operatorn flowWithLifecycle — det mest koncisa sättet för säker prenumeration på Flow i UI-lagret.
Låt oss titta på tre verkliga scenarier för användning av lifecycleScope i en Android-app i Kotlin.
class MapFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
locationProvider.observeLocation().collect { loc ->
updateMapMarker(loc)
}
}
}
}
}
Korutinen startar när fragmentet blir synligt (STARTED) och annulleras när det lämnar skärmen (STOPPED). Om användaren växlar till en annan app förbrukar platsuppdateringarna inte batteri.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
animateFadeIn(titleView)
delay(200)
animateSlideUp(contentView)
}
}
Animeringen startar endast när fragmentet är i förgrunden (RESUMED). Om användaren minimerar appen under animeringen annulleras korutinen, och vid återkomst startas animeringen om.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
while (isActive) {
syncData()
delay(30_000L)
}
}
}
Data synkroniseras var 30:e sekund, men endast när skärmen är synlig. isActive kontrollerar om korutinen inte har annullerats, vilket säkerställer säker utträde ur loopen när skärmen lämnas.
Båda scoperna är kopplade till livscykeln, men till olika aspekter av den. Att förstå skillnaden är avgörande för korrekt arkitektur av Android-applikationer.
viewModelScope är kopplad till ViewModel, som överlever skärmrotation. lifecycleScope är kopplad till LifecycleOwner (Activity/Fragment), som vid rotation förstörs och skapas på nytt. Detta bestämmer deras användningsscenarier.
I praktiken är kombinationen av båda scoperna vanlig: viewModelScope laddar data och hanterar tillstånd, lifecycleScope prenumererar på Flow från ViewModel med hänsyn till skärmens livscykel. Denna ansvarsuppdelning anses vara best practice inom modern Android-utveckling.
Låt oss titta på fyra vanliga misstag som utvecklare gör vid användning av lifecycleScope.
Om du startar dataladdning i lifecycleScope.launch kommer korutinen att annulleras vid skärmrotation och data måste laddas om. Använd viewModelScope för långvariga operationer. lifecycleScope — endast för UI-relaterade uppgifter.
Direktanrop av viewModel.someFlow.collect { ... } inuti lifecycleScope.launch fortsätter att samla in data även när skärmen inte är synlig. Detta kan leda till UI-uppdateringar i bakgrunden och onödig overhead. Använd alltid repeatOnLifecycle eller flowWithLifecycle.
Även om lifecycleScope annulleras vid DESTROYED, kan koden efter en suspend-punkt kanske inte köras vid plötslig annullering. Lita inte på att kod körs efter ett suspend-anrop, om du inte använder NonCancellable.
launchWhenStarted och dess analoger annullerar inte korutinen, bara pausar den. Om skärmen växlar flera gånger mellan förgrund och bakgrund ackumulerar korutinen uppskjutna anrop. Byt till repeatOnLifecycle — det är det enda korrekta sättet att synkronisera med Lifecycle.
Vanliga frågor
lifecycleScope annulleras automatiskt vid förstöring av LifecycleOwner. GlobalScope lever under hela applikationens körtid. En korutin i lifecycleScope kan inte uppdatera UI efter att komponenten förstörts, i GlobalScope kan den, vilket leder till krascher. Använd alltid lifecycleScope i UI-lagret.
Nej, ViewModel är inte en LifecycleOwner, så lifecycleScope är inte tillgänglig i den. ViewModel använder viewModelScope. Om koden måste köras i båda kontexterna — extrahera logiken till use case eller repository med suspend-funktioner.
Varje repeatOnLifecycle-anrop skapar en ny korutin som startar blocket när Lifecycle når det angivna tillståndet. Om repeatOnLifecycle anropas två gånger för samma tillstånd kommer båda blocken att köras oberoende. Vanligtvis räcker ett anrop i onViewCreated.
LifecycleScopes dispatcher kan inte ändras direkt — den använder Dispatchers.Main.immediate. Inuti korutinblocket kan du växla till en annan dispatcher via withContext. För tester, använd TestDispatcher med LifecycleOwner.
lifecycleScope annulleras när LifecycleOwner övergår till tillståndet DESTROYED (efter onDestroy). Enkla lifecycleScope.launch-anrop annulleras inte i onPause eller onStop. För paus vid övergång till bakgrunden, använd repeatOnLifecycle(STARTED) eller repeatOnLifecycle(RESUMED).
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också