Middle
Ինչպե՞ս եք կազմակերպում ֆրագմենտի և ծառայության փոխազդեցությունը ձեր հավելվածում։
sobes.tech AI
Պատասխան AI-ից
Հիմնական մեթոդները՝ փոխազդեցության միջեւ հատվածի եւ ծառայության՝ հետևյալն են.
- Կապված ծառայություն (Bound Service): հատվածը կապվում է ծառայությանը և ստանում է ուղիղ հասանելիություն ծառայության հանրային մեթոդներին
IBinderինտերֆեյսի միջոցով: - Սկսված ծառայություն (Started Service): հատվածը սկսում է ծառայությունը, ուղարկելով
Intent-ներ տվյալներով: Հետադարձ կապի համար ծառայությունը կարող է ուղարկել հեռարձակվողIntent-ներ կամ օգտագործելResultReceiver: - Հեռարձակվող
Intent-ներ (BroadcastReceiver): Ծառայությունը ուղարկում է հեռարձակվողIntent-ներ, որոնք հատվածը լսում է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
}
}
Ծառայությունից հեռարձակվող 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)
}