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)
}