Sobes.tech
Junior

Android uygulamalarında geliştirme yaparken hiç Service kullandınız mı?

sobes.tech yapay zeka

AI'dan gelen yanıt

Evet, kullandım. Android'de Service, kullanıcı arayüzü olmadan arka planda uzun süren işlemleri gerçekleştirmek için kullanılır.

Ana kullanım senaryoları:

  • Arka planda müzik çalma.
  • Dosya indirme.
  • Sunucu ile veri senkronizasyonu.
  • Konum takibi.

Service türleri:

  • Başlatılan Service: Uygulama bileşeni (örneğin, Activity) tarafından başlatılır ve bağımsız çalışır. stopSelf() veya stopService() ile durdurulur.
  • Bağlı Service: Müşteri-sunucu arayüzü sağlar. Bileşenler bindService() ile Service'e bağlanır ve IBinder aracılığıyla etkileşir. Tüm bileşenler bağlantısı kesildiğinde durdurulur.
  • Foreground Service: Kullanıcıya görünür işlemler yapar (örneğin, müzik çalma). startForeground() ile başlatılır ve bildirim gerektirir. Sistem böyle bir Service'i daha az sona erdirir.

Başlatılan Service'in yaşam döngüsü:

  1. onCreate(): Service oluşturulur.
  2. onStartCommand(): Her başlatma isteğinde çağrılır.
  3. onDestroy(): Service yok edilir.

Bağlı Service'in yaşam döngüsü:

  1. onCreate(): Service oluşturulur.
  2. onBind(): Bir istemci Service'e bağlandığında çağrılır. IBinder döner.
  3. onUnbind(): Tüm istemciler bağlantısı kesildiğinde çağrılır.
  4. onDestroy(): Service yok edilir.

Başlatılan Service örneği:

// MainActivity.kt
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            // UI'niz
            // Service başlatma örneği
            val serviceIntent = Intent(this, MyStartedService::class.java)
            startService(serviceIntent)
        }
    }
}

Basit bir Started Service örneği:

// MyStartedService.kt
import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.util.Log

class MyStartedService : Service() {

    private val TAG = "MyStartedService"

    override fun onCreate() {
        super.onCreate()
        Log.d(TAG, "onCreate")
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.d(TAG, "onStartCommand")
        // Uzun süren arka plan işlemi
        Thread {
            for (i in 0..10) {
                Log.d(TAG, "İterasyon $i")
                try {
                    Thread.sleep(1000)
                } catch (e: InterruptedException) {
                    e.printStackTrace()
                }
            }
            stopSelf() // Görev tamamlandıktan sonra Service'i durdur
        }.start()

        return START_STICKY // Sistem tarafından öldürülürse Service'i yeniden başlat
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d(TAG, "onDestroy")
    }

    override fun onBind(intent: Intent?): IBinder? {
        // Başlatılan Service için null döndür
        return null
    }
}

Service'in varsayılan olarak ana thread'de çalıştığını unutmayın. Uzun süren ve bloklayıcı işlemler için ayrı threadler veya Kotlin协程 (coroutine) kullanmak UI'nin kilitlenmesini önlemek için gereklidir.

Uzun süren görevlerle çalışırken, gecikmiş ve garantili görevleri gerçekleştirmek için daha esnek ve güvenilir bir yaklaşım sağlayan WorkManager kullanmak tercih edilir. WorkManager, sistem kısıtlamalarını dikkate alır ve uygulama kapalı olsa veya cihaz yeniden başlatılsa bile görevlerin yürütülmesini yönetir.