Sobes.tech
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ə IBinder interfeysi vasitəsilə xidmətin ictimai metodlarına birbaşa çıxış əldə edir.
  • Başladılmış Xidmət (Started Service): Fragment məlumatlarla Intent göndərərək xidməti işə salır. Geribildirim üçün, xidmət yayım məqsədli Intent göndərə bilər və ya ResultReceiver istifadə 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ı BroadcastReceiver vasitə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 ViewModel içindəki LiveData obyektini 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)
}