Sobes.tech
Middle

Колдонмоңузда фрагмент менен кызматтын өз ара аракеттенүүсүн кантип уюштурасыз?

sobes.tech AI

AIден жооп

Негизги ыкмалары бөлүм жана кызмат ортосундагы өз ара аракеттенүүнүн төмөнкүлөрү:

  • Байланыштуу кызмат (Bound Service): Бөлүм кызматка байланат жана IBinder интерфейси аркылуу кызматтын ачык ыкмаларына түз жеткиликтүү болот.
  • Башталган кызмат (Started Service): Бөлүм кызматты ишке киргизет, маалыматтар менен Intent жөнөтүү аркылуу. Кайтаруу үчүн кызмат кеңири тараган Intent жөнөтө алат же ResultReceiver колдонушу мүмкүн.
  • Таратуу Intent-тер (BroadcastReceiver): Кызмат таратуу Intent-терин жөнөтөт, аларды бөлүм BroadcastReceiver аркылуу угат.
  • Event Bus (мисалы, GreenDao EventBus, Otto): Компоненттер ортосунда окуялар алмашуу үчүн колдонулат, борбордук башкаруучу аркылуу. Кызмат окуяларды жарыялайт, бөлүм аларга жазылат.
  • LiveData: Бөлүм ViewModel ичиндеги LiveData объектисин көзөмөлдөй алат, ал өз кезегинде кызмат менен өз ара аракеттенет (мисалы, репозитор аркылуу же түздөн-түз метод чакыруусу менен).

Тандоо учурунда эске алуу керек:

  • Кызматтын түрү (байланыштуу же башталган).
  • Ички өз ара аракеттенүүнүн зарылдыгы.
  • өткөрүлүүчү маалыматтын татаалдыгы.
  • бөлүм жана кызматтын жашоо цикли.
  • Коддун окумдуулугу жана колдоо мүмкүнчүлүгү.

Мисал катары бөлүмдү кызматка байлоо:

// Бөлүм
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
    }
}

Кызматтан тарату Intent мисалы:

// Кызмат
private fun sendUpdate(data: String) {
    Intent("my.app.SERVICE_UPDATE").apply {
        putExtra("data", data)
    }.also { intent ->
        sendBroadcast(intent)
    }
}

Intent кабыл алуу мисалы:

// Бөлүм
private val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        when (intent?.action) {
            "my.app.SERVICE_UPDATE" -> {
                val data = intent.getStringExtra("data")
                // Маалыматты иштетүү
            }
        }
    }
}

override fun onResume() {
    super.onResume()
    IntentFilter("my.app.SERVICE_UPDATE").also { filter ->
        requireContext().registerReceiver(receiver, filter)
    }
}

override fun onPause() {
    super.onPause()
    requireContext().unregisterReceiver(receiver)
}