Sobes.tech
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)
}