onStart: Android Ekranında Activity Görünürlüğünün Özü

Yazar: IT Sectr Yayınlanma: 2026-03-04 Okuma süresi: 9 dk

onStart, bir Activity veya Fragment kullanıcıya görünür hale geldiğinde çağrılan bir Android yaşam döngüsü yöntemidir. Bu anda, ekran cihaz görüntüsünde belirir, ancak onResume çağrılana kadar giriş odağı olmadığı için henüz kullanıcıyla etkileşime giremez. onStart yöntemi, sistem dinleyicilerini kaydetmek, coğrafi konum servislerine bağlanmak ve bileşen ekranda görünürken çalışması gereken animasyonları başlatmak için idealdir. Tam Activity yaşam döngüsü hakkında daha fazla bilgi için Activity Lifecycle makalesine bakın.

Ana Noktalar

  • onStart — Activity veya Fragment ekranda görünür hale geldiğinde çağrılır; onResume'dan önce gelir
  • Dinleyici kaydı — BroadcastReceiver, LocationListener, SensorListener onStart'te kaydedilir ve onStop'ta kayıttan çıkarılır
  • Animasyonlar — ekran görünürken çalışması gereken animasyonları başlatma; onStop'ta duraklatma
  • Bağlı hizmetler — onStart'te bindService aracılığıyla istemci-sunucu hizmetlerine bağlanma, onStop'ta bağlantıyı kesme
  • onStart vs onResume — onStart = görünürlük, onResume = odak + etkileşim; farklı ekran etkinliği seviyeleri
  • Fragment.onStart — Activity.onStart'tan sonra, Fragment kapsayıcıda görünür hale geldiğinde çağrılır
  • onStart/onStop çifti — onStart'te bağlanan kaynaklar, sızıntıları önlemek için onStop'ta serbest bırakılmalıdır

Android'de onStart'ın Özü

onStart, Activity yaşam döngüsünün ikinci yöntemidir ve sistem tarafından onCreate'ten sonra (veya durdurulmuş bir durumdan dönülürken onRestart'tan sonra) çağrılır. onStart çağrıldığı anda Activity veya Fragment ekranda görünür hale gelir. Kullanıcı arayüzü görür, ancak ekran henüz etkileşim için hazır değildir — giriş odağı yalnızca onResume'dan sonra görünecektir.

onStart yöntemi, bir Activity'nin “görünür ömrü” (visible lifetime) — onStart ve onStop arasındaki aralığa dahildir. Bu süre boyunca Activity, diğer pencereler (orneğin, şeffaf bir Activity veya iletişim penceresi) tarafından kısmen kapatılabilir, ancak UI'si görünür kalır. Bu, görünür ömrü, Activity'nin tam giriş odağına sahip olduğu “ön plan ömrü”nden (onResume — onPause) ayırır.

Bu üç seviyeli hiyerarşiyi anlamak, kodun doğru şekilde dağıtılması için kritiktir. onCreate — tek seferlik başlatma, onStart — görünür kaynakları bağlama, onResume — özel kaynaklara özel erişim. Bu seviyeleri karıştıran bir geliştirici, ekranlar arasında geçiş yaparken bellek sızıntıları veya uygulamanın hatalı davranışı riskini alır.

Activity'de onStart

Activity'de, onStart yöntemi ekran görüntüde her belirdiğinde çağrılır — hem ilk başlatmada (onCreate'ten sonra) hem de arka plandan dönüşte (onRestart'tan sonra). onCreate'ten farklı olarak, onStart bir Activity örneğinin ömrü boyunca birden çok kez çağrılabilir, bu nedenle ekran her göründüğünde çalıştırılması gereken kod buraya yerleştirilir.

kotlin
class DashboardActivity : AppCompatActivity() {
    private val connectivityReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val isConnected = ... // ConnectivityManager kontrolü
            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()
    }
}

Ana kural: onStart'te bağlanan tüm kaynaklar onStop'ta serbest bırakılmalıdır. Bu, Activity ekrandan gizlendiğinde pil tüketmemesini, sistem olaylarını dinlememesini ve bellek kaplamamasını sağlar. Android Studio, karşılık gelen kayıt silme olmadan BroadcastReceiver kaydetme konusunda uyaran lint kuralları içerir.

Fragment'te onStart

Fragment'te onStart, kapsayıcı Activity'nin yaşam döngüsüyle yakından ilişkilidir. Fragment, onu içeren Activity onStart'ı aldıktan sonra onStart çağrısını alır. Ancak, Fragment gecikmeli modda eklenirse (addToBackStack olmadan FragmentTransaction.commit()), onStart gecikmeli olarak çağrılabilir.

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()
    }
}

Fragment.onStart özellikleri: Fragment, offscreenPageLimit = 1 olan bir ViewPager'da ise, komşu fragmentler de görünür hale gelmeden önce onStart alır. Bu, erken dinleyici kaydına yol açabilir. Bu gibi durumlarda, setUserVisibleHint() yöntemini kullanın veya yalnızca gerçekten görünür fragmentler için dinleyici kaydetmek üzere onStart içinde isVisible'i kontrol edin.

onStart ve onResume Arasındaki Fark

onStart ve onResume arasındaki temel fark, ekran etkinliği seviyesidir. onStart, Activity'nin ekranda görünür olduğunu ancak mutlaka ön planda olmadığını belirtir. onResume, Activity'nin ön planda olduğunu ve giriş odağına sahip olduğunu belirtir. Fark, bir iletişim penceresi örneğiyle gösterilir: Activity'nin üzerinde bir Dialog göründüğünde, Activity onResume'u kaybeder (onPause çağrılır) ancak görünür kalır — onStart/onStop çağrılmaz.

Karşılaştırma tablosu, her yöntemin hangi senaryolarda çağrıldığını açıkça gösterir:

SenaryoonStartonResume
Uygulama başlatmaÇağrılırÇağrılır
Activity üzerinde Dialog açıldıÇağrılmazonPause (odağı kaybeder)
Ana Ekran düğmesine basıldıonStop (gizli)onPause → onStop
Son Kullanılanlardan dönüşonStart (görünür)onResume (odak)
Ekran döndürmeonCreate → onStart→ onResume
Gelen çağrıonStop (gizli)onPause → onStop

Bu tablo, geliştiricinin belirli bir kodu hangi yönteme yerleştireceğine karar vermesine yardımcı olur. Örneğin, uygulama herhangi bir ekran kaplamasında (bir diyalog dahil) video oynatmayı duraklatmalıysa, kod onPause'a konur. Video yalnızca ekran tamamen gizlendiğinde durmalıysa — kod onStop'a konur.

Dinleyici ve Hizmet Kaydı

onStart, yalnızca Activity ekranda görünürken çalışması gereken dinleyicileri kaydetmek için en uygun yerdir. Bu, üç ana sistem bileşeni türünü ilgilendirir: sistem olayları için BroadcastReceiver, coğrafi konum için LocationListener ve cihaz sensörleri için SensorListener.

onStart'te BroadcastReceiver

BroadcastReceiver, onStart'te Context.registerReceiver() aracılığıyla dinamik olarak kaydedilir ve onStop'ta unregisterReceiver() aracılığıyla kayıttan çıkarılır. Dinamik kayıt, statik kayda (manifestte) tercih edilir çünkü alıcının ömrünü Activity'nin görünürlük süresiyle sınırlar — Activity gizliyken uygulama sistem broadcast mesajlarıyla uyanmaz.

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 ve SensorListener

Coğrafi konum ve sensörler kaynak yoğun işlemlerdir. onStart'te GPS güncellemeleri istemek ve onStop'ta iptal etmek, ekran gizliyken uygulamanın pil tüketmemesini sağlar. İnce ayar için, minimum aralık ve mesafe ile requestLocationUpdates kullanın — örneğin, 10 saniye ve 10 metre, bu da doğruluk ve güç tüketimi arasında en uygun dengeyi sağlar.

Animasyonlar ve onStart

Animasyonları onCreate yerine onStart'ta başlatmak, animasyonun ekran her göründüğünde başlamasını sağlar. Bir animasyonu onCreate'te başlatırsanız, yalnızca ilk Activity oluşturmada çalışır, arka plandan dönüşte çalışmaz. onStart, Activity her görünür hale geldiğinde çağrılır ve bu da onu döngüel animasyonlar ve geçişler başlatmak için ideal yer yapar.

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()
}

ObjectAnimator veya ValueAnimator kullanan animasyonlar için onStop'ta cancel() çağırmak önemlidir. Activity gizlendikten sonra animasyon çalışmaya devam ederse, gereksiz yere GPU ve CPU kaynaklarını tüketir, cihaz performansını düşürür ve pil tükenmesini hızlandırır. Android Studio Profiler (GPU grafiği), etkin animasyonları izlemenize ve sızıntıları tespit etmenize olanak tanır.

onStart/onStop eşleştirme kuralı, önizleme için kamera (CameraX) ile çalışırken de geçerlidir. Kamerayı onStart'ta açmak ve onStop'ta kapatmak, uygulamanız ekranda görünür olmadığında kameranın diğer uygulamalar için bloke edilmemesini sağlar. Bu kuralı ihlal etmek, Google Play'deki olumsuz yorumların yaygın bir nedenidir.

Sıkça Sorulan Sorular

Dinleyici kaydı için onStart ve onResume arasındaki fark nedir?

onStart — ekran görünürken çalışması gereken dinleyiciler için (BroadcastReceiver, LocationListener, SensorListener). onResume — özel erişim gerektiren kaynaklar için (kamera, video yakalama, konuşma tanıma). Sistem olay dinleyicileri özel erişim gerektirmez ve kısmi kaplama ile çalışabilir — onStart'ta kaydedilirler. Kamera yalnızca tam odakla etkin olmalıdır — onResume'da açılır.

onStart neden çağrılmayabilir?

Activity görünür bir duruma geçerse onStart her zaman çağrılır. onStart olmadan tek senaryo — Activity oluşturulur ve hemen sonlandırılır (örneğin, onCreate'teki bir hata nedeniyle). Bu durumda, onCreate'ten hemen sonra onDestroy çağrılır. Ancak bu, doğru yazılmış kodda oluşmaması gereken acil bir senaryodur.

onStart, onResume olmadan çağrılabilir mi?

Evet, başka bir Activity veya şeffaf bir pencere Activity'nin üzerinde hemen açılırsa onStart, onResume alamayabilir. Örneğin, onCreate'ten sonra bir yetkilendirme ekranı başlatılırsa (Activity A → Activity B), Activity A'da onStart çağrılır ancak onResume çağrılmaz — B ekranı tarafından kaplandığında hemen onPause → onStop alır.

onStart kaç kez çağrılabilir?

onStart, bir Activity örneğinin ömrü boyunca birden çok kez çağrılabilir. Activity her gizli durumdan (onStop) görünür duruma geçtiğinde onStart çağrılır. Pratikte, aktif uygulama kullanımıyla, onStart oturum başına düzinelerce veya yüzlerce kez çağrılabilir.

onStart'ta veri yüklenmeli mi?

onStart'ta veri yüklemek, verilerin ekran her göründüğünde güncellenmesi gerekiyorsa haklıdır. Örneğin, bir haber akışı veya bildirim listesi. Ancak yükleme, UI iş parçacığını bloke etmemek için lifecycleScope ile coroutine aracılığıyla asenkron olmalıdır. Ekran görünürleri arasında değişmeyen veriler için, onCreate'te bir kez yüklemek yeterlidir.

Özet

  • onStart — görünür ömür yöntemi; Activity veya Fragment ekranda göründüğünde çağrılır
  • onStart'ta kayıt — BroadcastReceiver, LocationListener, SensorListener onStart'ta kaydedilir ve onStop'ta kayıttan çıkarılır
  • onStart vs onResume — onStart = görünürlük, onResume = giriş odağı; farklı kaynak türleri için farklı seviyeler
  • Animasyonlar — döngüel animasyonları onStart'ta başlat, onStop'ta durdur; GPU kaynak sızıntılarını önler
  • Fragment.onStart — Activity.onStart'a bağlı; ViewPager'da komşu fragmentler için önceden çağrılır
  • Eşleştirme kuralı — tüm onStart kaynakları onStop'ta serbest bırakılmalıdır, aksi halde bellek ve pil sızıntıları
  • Veri yükleme — onStart'ta, ekran her göründüğünde güncellenmesi gereken verileri yükle

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun