onStart: essensen, synligheten av Activity på Android-skärmen

Författare: IT Sectr Publicerad: 2026-03-04 Lästid: 9 min

onStart — är en livscykelmetod i Android som anropas när Activity eller Fragment blir synliga för användaren. I detta ögonblick visas skärmen på enhetens display, men kan ännu inte interagera med användaren — inmatningsfokus saknas tills anrop av onResume. Metoden onStart är idealisk för registrering av systemlyssnare, anslutning till geolokaliseringstjänster och start av animationer som ska fungera medan komponenten är synlig på skärmen. Läs mer om Activitys fulla livscykel i artikeln Activity Lifecycle.

Huvudpunkter

  • onStart — anropas när Activity eller Fragment blir synligt på skärmen; föregår onResume
  • Registrering av lyssnare — BroadcastReceiver, LocationListener, SensorListener registreras i onStart och avregistreras i onStop
  • Animationer — start av animationer som ska fungera medan skärmen är synlig; paus i onStop
  • Bound-tjänster — anslutning till klient-server-tjänster via bindService i onStart, frånkoppling i onStop
  • onStart vs onResume — onStart = synlighet, onResume = fokus + interaktion; olika nivåer av skärmaktivitet
  • Fragment.onStart — anropas efter Activity.onStart, när Fragment blir synligt i containern
  • Paret onStart/onStop — resurser som anslutits i onStart måste frigöras i onStop för att förhindra läckor

Essensen av metoden onStart i Android

onStart — den andra metoden i Activitys livscykel, anropad av systemet efter onCreate (eller efter onRestart vid återgång från stoppat tillstånd). I anropsögonblicket blir Activity eller Fragment synliga på skärmen. Användaren ser gränssnittet, men skärmen är ännu inte redo för interaktion — inmatningsfokus visas först efter onResume.

Metoden onStart ingår i Activitys "synliga livslängd" (visible lifetime) — intervallet mellan onStart och onStop. Under denna period kan Activity delvis täckas av andra fönster (till exempel ett transparent Activity eller dialogruta), men dess användargränssnitt förblir synligt. Detta skiljer den synliga livslängden från "livslängden i förgrunden" (onResume — onPause), när Activity har fullt inmatningsfokus.

Att förstå denna tre-nivåers hierarki är kritiskt viktigt för korrekt fördelning av kod. onCreate — engångsinitiering, onStart — anslutning av synliga resurser, onResume — monopolåtkomst till exklusiva resurser. En utvecklare som blandar ihop dessa nivåer riskerar att skapa minnesläckor eller felaktigt beteende hos appen vid växling mellan skärmar.

onStart i Activity

I Activity anropas metoden onStart varje gång skärmen visas på displayen — både vid första start (efter onCreate) och vid återgång från bakgrundsläge (efter onRestart). Till skillnad från onCreate kan onStart anropas flera gånger under en Activity-instans livstid, därför placeras här kod som ska utföras varje gång skärmen visas.

kotlin
class DashboardActivity : AppCompatActivity() {
    private val connectivityReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val isConnected = ... // kontroll av ConnectivityManager
            binding?.statusIndicator?.setColor(
                if (isConnected) Color.GREEN else Color.RED
            )
        }
    }

    override fun onStart() {
        super.onStart()
        registerReceiver(
            connectivityReceiver,
            IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
        )
        SensorManager.getInstance().registerStepCounter()
    }

    override fun onStop() {
        unregisterReceiver(connectivityReceiver)
        SensorManager.getInstance().unregisterStepCounter()
        super.onStop()
    }
}

Huvudregel: alla resurser som anslutits i onStart måste frigöras i onStop. Detta garanterar att när Activity är dold från skärmen, förbrukar den inte batteri, lyssnar inte på systemhändelser och upptar inte minne. Android Studio innehåller lint-regler som varnar för registrering av BroadcastReceiver utan motsvarande avregistrering.

onStart i Fragment

onStart i Fragment är nära kopplat till livscykeln för container-Activity. Fragment får onStart-anropet efter att Activity som innehåller det har fått onStart. Men om Fragment har lagts till i uppskjutet läge (FragmentTransaction.commit() utan addToBackStack), kan onStart anropas med fördröjning.

kotlin
class MapFragment : Fragment() {
    private var mapView: MapView? = null

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        mapView = MapView(requireContext())
        return mapView!!
    }

    override fun onStart() {
        super.onStart()
        mapView?.onStart()
        LocationService.connect(requireContext())
    }

    override fun onStop() {
        mapView?.onStop()
        LocationService.disconnect()
        super.onStop()
    }
}

Specificitet för Fragment.onStart: om Fragment befinner sig i en ViewPager med offscreenPageLimit = 1, kommer angränsande fragment också att få onStart innan de blir synliga. Detta kan leda till förtida registrering av lyssnare. För sådana fall, använd metoden setUserVisibleHint() eller kontroll av isVisible inuti onStart för att registrera lyssnare endast för verkligt synliga fragment.

Skillnad mellan onStart och onResume

Huvudskillnaden mellan onStart och onResume — nivån av skärmaktivitet. onStart signalerar att Activity är synligt på skärmen, men inte nödvändigtvis i förgrunden. onResume signalerar att Activity är i förgrunden och har inmatningsfokus. Skillnaden demonstreras med exemplet på en dialogruta: när en Dialog visas ovanför Activity, förlorar Activity onResume (onPause anropas), men förblir synlig — onStart/onStop anropas inte.

Skillnadstabellen visar tydligt i vilka scenarier varje metod anropas:

ScenarioonStartonResume
Start av applikationenAnropasAnropas
Dialog öppnad ovanför ActivityAnropas inteonPause (fokusförlust)
Tryck på "Hem"-knappenonStop (dold)onPause → onStop
Återgång från "Senaste"onStart (synlig)onResume (fokus)
SkärmrotationonCreate → onStart→ onResume
Inkommande samtalonStop (dold)onPause → onStop

Denna tabell hjälper utvecklaren att besluta i vilken metod specifik kod ska placeras. Om appen till exempel måste pausa videouppspelning vid varje övertäckning av skärmen (även med en dialog), placeras koden i onPause. Om videon endast ska stoppas vid fullständig döljning av skärmen — placeras koden i onStop.

Registrering av lyssnare och tjänster

onStart — optimal plats för registrering av lyssnare som endast ska fungera medan Activity är synligt på skärmen. Detta gäller tre huvudtyper av systemkomponenter: BroadcastReceiver för systemhändelser, LocationListener för geolokalisering och SensorListener för enhetssensorer.

BroadcastReceiver i onStart

BroadcastReceiver registreras dynamiskt via Context.registerReceiver() i onStart och avregistreras i onStop via unregisterReceiver(). Dynamisk registrering är att föredra framför statisk (i manifestet), eftersom den begränsar mottagarens livslängd till Activitys synlighetsperiod — appen vaknar inte av systemets broadcast-meddelanden när Activity är dolt.

kotlin
private val batteryReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent) {
        val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
        binding?.batteryText?.text = "$level%"
    }
}

override fun onStart() {
    super.onStart()
    registerReceiver(batteryReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
}

override fun onStop() {
    unregisterReceiver(batteryReceiver)
    super.onStop()
}

LocationListener och SensorListener

Geolokalisering och sensorer — resurskrävande operationer. Begäran av GPS-uppdateringar i onStart och annullering i onStop garanterar att appen inte förbrukar batteri när skärmen är dold. För finjustering används requestLocationUpdates med minimalt intervall och distans — till exempel 10 sekunder och 10 meter, vilket ger en optimal balans mellan noggrannhet och energiförbrukning.

Animationer och onStart

Start av animationer i onStart, inte i onCreate, garanterar att animationen startar varje gång skärmen visas. Om du startar animationen i onCreate fungerar den endast vid första skapandet av Activity, men inte vid återgång från bakgrundsläge. onStart anropas varje gång Activity blir synligt, vilket gör det till en idealisk plats för start av cykliska animationer och övergångar.

kotlin
private lateinit var pulseAnimator: ValueAnimator

override fun onStart() {
    super.onStart()
    pulseAnimator.start()
    binding?.loadingIndicator?.animate()?.alpha(1f)?.start()
}

override fun onStop() {
    pulseAnimator.cancel()
    binding?.loadingIndicator?.animate()?.cancel()
    super.onStop()
}

För animationer som använder ObjectAnimator eller ValueAnimator är det viktigt att anropa cancel() i onStop. Om animationen fortsätter att fungera efter att Activity dolts, förbrukar den onödigt GPU- och CPU-resurser, vilket minskar enhetens prestanda och påskyndar batteriurladdningen. Android Studio Profiler (GPU-graf) gör det möjligt att spåra aktiva animationer och upptäcka läckor.

Regeln om paret onStart/onStop gäller även arbete med kamera för förhandsvisning (CameraX). Öppning av kameran i onStart och stängning i onStop garanterar att kameran inte är blockerad för andra appar när din app inte är synlig på skärmen. Överträdelse av denna regel är en av de vanliga orsakerna till negativa recensioner på Google Play.

Vanliga frågor

Vad är skillnaden mellan onStart och onResume för registrering av lyssnare?

onStart — för lyssnare som ska fungera medan skärmen är synlig (BroadcastReceiver, LocationListener, SensorListener). onResume — för resurser som kräver monopolåtkomst (kamera, videoinspelning, taligenkänning). Systemhändelselyssnare kräver inte monopolåtkomst och kan fungera vid delvis övertäckning — de registreras i onStart. Kameran bör vara aktiv endast med fullt fokus — öppnas i onResume.

Varför kan onStart inte anropas?

onStart anropas alltid om Activity övergår till synligt tillstånd. Det enda scenariot utan onStart — Activity skapas och avslutas omedelbart (till exempel på grund av ett fel i onCreate). I detta fall följer onDestroy direkt efter onCreate. Men detta är ett nödfallsscenario som inte borde förekomma i korrekt skriven kod.

Kan onStart anropas utan onResume?

Ja, onStart kan inte få onResume om ett annat Activity eller transparent fönster omedelbart öppnas ovanför Activity. Till exempel, om en autentiseringsskärm startas efter onCreate (Activity A → Activity B), anropas onStart i Activity A, men onResume inte — det får direkt onPause → onStop när det täcks av skärm B.

Hur många gånger kan onStart anropas?

onStart kan anropas flera gånger under en Activity-instans livstid. Varje gång Activity övergår från dolt tillstånd (onStop) till synligt tillstånd, anropas onStart. I praktiken, vid aktiv användning av appen, kan onStart anropas tiotals eller hundratals gånger per session.

Är det värt att ladda data i onStart?

Laddning av data i onStart är motiverat om data måste uppdateras varje gång skärmen visas. Till exempel en nyhetsflöde eller notifikationslista. Men laddningen bör vara asynkron — via korutiner med lifecycleScope, för att inte blockera UI-tråden. För data som inte ändras mellan skärmvisningar räcker det att ladda dem en gång i onCreate.

Sammanfattning

  • onStart — metod för synlig livslängd; anropas när Activity eller Fragment visas på skärmen
  • Registrering i onStart — BroadcastReceiver, LocationListener, SensorListener registreras i onStart och avregistreras i onStop
  • onStart vs onResume — onStart = synlighet, onResume = inmatningsfokus; olika nivåer för olika resurstyper
  • Animationer — start av cykliska animationer i onStart, stopp i onStop; förhindrar läckage av GPU-resurser
  • Fragment.onStart — bundet till Activity.onStart; i ViewPager anropas för angränsande fragment i förväg
  • Parregel — alla onStart-resurser måste frigöras i onStop, annars minnes- och batteriläckage
  • Dataladdning — i onStart laddas data som måste uppdateras vid varje visning av skärmen

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.

Diskutera projektet

Läs också