Sobes.tech
Middle

როგორ ორგანიზებთ თქვენს აპლიკაციაში ფრაგმენტის და სერვისის ურთიერთქმედებას?

sobes.tech AI

პასუხი AI-სგან

मुख्य संवाद माध्यमहरू बीचको अन्तरक्रिया निम्नानुसार छन्:

  • बाइन्ड सेवा (Bound Service): भागले सेवासँग जडान हुन्छ र IBinder इन्टरफेस मार्फत सार्वजनिक विधिहरूमा प्रत्यक्ष पहुँच प्राप्त गर्दछ।
  • सुरु गरिएको सेवा (Started Service): भागले सेवा सुरु गर्दछ, र Intent मार्फत डेटा पठाउँछ। प्रतिक्रिया को लागि, सेवा ResultReceiver प्रयोग गर्न सक्छ वा प्रसारण Intent पठाउन सक्छ।
  • प्रसारण Intent-हरू (BroadcastReceiver): सेवा प्रसारण Intent-हरू पठाउँछ, जुन भागले BroadcastReceiver को माध्यमबाट सुन्छ।
  • इभेन्ट बस (जस्तै, 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)
}