Как получить доступ к сервису из фрагмента через его активность?

У меня есть действие, которое, насколько я могу судить, благополучно привязывается к службе каждый раз, когда это действие создается. Когда действие создается в первый раз, оно также запускает службу с помощью команды startService, как показано ниже:

    private fun attachRecorderService() {
       val intent = Intent(this, AudioRecorderService::class.java)
       bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE)
       if (!mBooleanRecorderServiceStarted) {
           startService(intent)
           mBooleanRecorderServiceStarted = true
       }
    }

Все фрагменты этой активности получают ссылку на эту службу в своей функции onActivityCreated () следующим образом:

    override fun onActivityCreated(savedInstanceState: Bundle?) {
       super.onActivityCreated(savedInstanceState)
       val parentActivity = activity as MainActivity
       mAudioRecorderService = parentActivity.mAudioRecorderService

Это отлично работает при первом создании фрагмента, но как только экран поворачивается, я получаю сообщение об ошибке, сообщающее мне, что служба не была инициализирована в действии.

lateinit property mAudioRecorderService has not been initialized

Насколько я могу судить, onActivityCreated () во фрагменте конкурирует с onCreate () в действии и пытается получить ссылку до того, как onCreate () инициализирует ее.

Чего я не понимаю. Я думал, что onActivityCreated () дождался завершения после onCreate ().

Что я делаю не так? Должен ли я использовать какой-то обратный вызов во фрагменте, который срабатывает только тогда, когда действие привязано к службе? Я видел упоминания об этом, но понятия не имею, как это сделать.

Вопрос Связь между Activity и Service касается действий и услуг. Я спрашиваю о фрагментах, которые прикреплены к Activity, и о том, как они могут получить доступ к службе, к которой Activity уже привязано.

Возможный дубликат Связь между Activity и Service

Zoe 15.08.2018 10:08

Этот вопрос касается деятельности и услуг. Я спрашиваю о фрагментах, которые прикреплены к Activity, и о том, как они могут получить доступ к службе, к которой Activity уже привязано. Ни в одном из ответов я не вижу, где задан этот вопрос.

John 15.08.2018 12:28

Это все та же система

Zoe 15.08.2018 12:32

Может оказаться, что мой вопрос дублирует это: stackoverflow.com/questions/40750712/… Он содержит ответ, который, похоже, может решить мою проблему.

John 15.08.2018 12:50
0
4
825
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Служба недоступна сразу после вызова bindService. Используйте ServiceConnection. Когда вызывается onServiceConnected, служба готова к использованию

private val connection = object : ServiceConnection {
    override fun onServiceDisconnected(p0: ComponentName?) {

    }

    override fun onServiceConnected(p0: ComponentName, binder: IBinder) {

    }
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    application.bindService(Intent(application, MyService::class.java), connection, Context.BIND_AUTO_CREATE)
}

Спасибо, Сатива. Я использую onServiceConnected в своей деятельности. Но он, по-видимому, завершается после того, как onCreate () завершает действие, следовательно, гонка с onActivityCreated () во фрагменте. Итак, как мне использовать обратный вызов onServiceConnected () из фрагмента, чтобы избежать гонки?

John 15.08.2018 12:22

Вы можете просто вызвать bindService в Activity в onCreate, чтобы использовать сервис в действии, и во фрагменте в onActivityCreated, чтобы использовать его во фрагменте. У Сервиса будет только один экземпляр. Его можно привязать к сколь угодно большому количеству действий и фрагментов.

sativa 15.08.2018 14:24

Спасибо. Думаю, мне придется это сделать. Я пытался привязаться к службе только один раз в Activity, а затем передать ссылку на эту привязку фрагментам. Но, похоже, возникает гонка между обратным вызовом onActivityCreated () и обратным вызовом onServiceConnected (). Я также могу попробовать привязать к контексту приложения, как описано здесь: stackoverflow.com/questions/15235773/…

John 15.08.2018 15:07

Другие вопросы по теме