Sobes.tech
Middle

Чӣ гуна ташкил медиҳед ҳамкории байни парчам ва хидмат дар барномаи шумо?

sobes.tech AI

Ҷавоб аз AI

Роҳҳои асосии муоширати байни қисм ва хидматҳо чунинанд:

  • Хидмати мустаҳкам (Bound Service): Қисм ба хидмат пайваст мешавад ва ба воситаи интерфейси IBinder ба таври мустақим ба усулҳои умумӣ дастрасӣ пайдо мекунад.
  • Хидмати оғозёбӣ (Started Service): Қисм хидматро бо ирсол кардани ниятҳо (Intent) бо маълумот оғоз мекунад. Барои пайгирии баргардон, хидмат метавонад ниятҳои паҳншаванда ирсол кунад ё ResultReceiver-ро истифода барад.
  • Ниятҳои паҳншаванда (BroadcastReceiver): Хидмат ниятҳои паҳншавандаро ирсол мекунад, ки қисм тавассути BroadcastReceiver гӯш мекунад.
  • Буси ҳодиса (масалан, GreenDao EventBus, Otto): Барои мубодилаи ҳодисаҳо байни компонентҳо тавассути диспетчери марказӣ истифода мешавад. Хидмат ҳодисаҳоро нашр мекунад ва қисм ба онҳо обуна мешавад.
  • LiveData: Қисм метавонад объект LiveData дар ViewModel-ро назорат кунад, ки ба навбат бо хидмат муошират мекунад (масалан, тавассути репозитор ё даъвати мустақим ба усулҳои хидмат пайвастшуда).

Ҳангоми интихоби усул, ман ба назар мегирам:

  • Навъи хидмат (мустаҳкам ё оғозёбӣ).
  • Зарурати муоширати дуҷониба.
  • Суръати интиқол додани маълумот.
  • Давомнокии ҳаёти қисм ва хидмат.
  • Фаҳмошавӣ ва нигоҳдории коди.

Масалан, пайваст кардани қисм ба хидмат:

// Қисм
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
    }
}

Масалан, ирсол кардани ниятҳои паҳншаванда аз хидмат:

// Хидмат
private fun sendUpdate(data: String) {
    Intent("my.app.SERVICE_UPDATE").apply {
        putExtra("data", data)
    }.also { intent ->
        sendBroadcast(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)
}