Middle
Tətbiqinizdə fraqment və xidmət arasında qarşılıqlı əlaqəni necə təşkil edirsiniz?
sobes.tech Süni İntellekt
AI-dan cavab
Fragment və xidmət arasında qarşılıqlı əlaqənin əsas yollarını sadalayacağam:
- Bəndli Xidmət (Bound Service): Fragment xidmətə qoşulur və
IBinderinterfeysi vasitəsilə xidmətin ictimai metodlarına birbaşa çıxış əldə edir. - Başladılmış Xidmət (Started Service): Fragment məlumatlarla
Intentgöndərərək xidməti işə salır. Geribildirim üçün, xidmət yayım məqsədliIntentgöndərə bilər və yaResultReceiveristifadə edə bilər. - Yayım məqsədli Intentlər (
BroadcastReceiver): Xidmət yayım məqsədli intentlər göndərir və fragment onlarıBroadcastReceivervasitəsilə dinləyir. - Hadisə Otobusu (məsələn, GreenDao EventBus, Otto): Komponentlər arasında hadisələri dəyişmək üçün istifadə olunur. Xidmət hadisələri yayımlayır və fragment onlara abunə olur.
- LiveData: Fragment
ViewModeliçindəkiLiveDataobyektini izləyə bilər və bu obyekt, öz növbəsində, xidmətlə qarşılıqlı əlaqədə ola bilər (məsələn, depo və ya birbaşa bağlı xidmət metodları vasitəsilə).
Yöntəmi seçərkən, aşağıdakı amilləri nəzərə alıram:
- Xidmətin növü (bəndli və ya başlatılmış).
- İki tərəfli qarşılıqlı əlaqənin ehtiyacı.
- ötürülən məlumatların mürəkkəbliyi.
- Fragment və xidmətin həyat dövrü.
- Kodun oxunaqlılığı və saxlanması.
Fragmentin xidmətə qoşulması nümunəsi:
// Fragment
private lateinit var myService: MyService
private var isBound = false
private val connection = object : ServiceConnection {
override fun onServiceConnected(className: ComponentName, service: IBinder) {
val binder = service as MyService.LocalBinder
myService = binder.getService()
isBound = true
}
override fun onServiceDisconnected(arg0: ComponentName) {
isBound = false
}
}
override fun onStart() {
super.onStart()
Intent(requireContext(), MyService::class.java).also { intent ->
requireContext().bindService(intent, connection, Context.BIND_AUTO_CREATE)
}
}
override fun onStop() {
super.onStop()
if (isBound) {
requireContext().unbindService(connection)
isBound = false
}
}
Xidmətin yayım məqsədli intent göndərməsi nümunəsi:
// Xidmət
private fun sendUpdate(data: String) {
Intent("my.app.SERVICE_UPDATE").apply {
putExtra("data", data)
}.also { intent ->
sendBroadcast(intent)
}
}
Fragmentdə yayım intentini qəbul etmə nümunəsi:
// Fragment
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
when (intent?.action) {
"my.app.SERVICE_UPDATE" -> {
val data = intent.getStringExtra("data")
// Məlumatların işlənməsi
}
}
}
}
override fun onResume() {
super.onResume()
IntentFilter("my.app.SERVICE_UPDATE").also { filter ->
requireContext().registerReceiver(receiver, filter)
}
}
override fun onPause() {
super.onPause()
requireContext().unregisterReceiver(receiver)
}