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()veyastopService()ile durdurulur. - Bağlı Service: Müşteri-sunucu arayüzü sağlar. Bileşenler
bindService()ile Service'e bağlanır veIBinderaracı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ü:
onCreate(): Service oluşturulur.onStartCommand(): Her başlatma isteğinde çağrılır.onDestroy(): Service yok edilir.
Bağlı Service'in yaşam döngüsü:
onCreate(): Service oluşturulur.onBind(): Bir istemci Service'e bağlandığında çağrılır.IBinderdöner.onUnbind(): Tüm istemciler bağlantısı kesildiğinde çağrılır.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.