У меня есть действие, которое, насколько я могу судить, благополучно привязывается к службе каждый раз, когда это действие создается. Когда действие создается в первый раз, оно также запускает службу с помощью команды 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, и о том, как они могут получить доступ к службе, к которой Activity уже привязано. Ни в одном из ответов я не вижу, где задан этот вопрос.
Это все та же система
Может оказаться, что мой вопрос дублирует это: stackoverflow.com/questions/40750712/… Он содержит ответ, который, похоже, может решить мою проблему.
Служба недоступна сразу после вызова 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 () из фрагмента, чтобы избежать гонки?
Вы можете просто вызвать bindService в Activity в onCreate, чтобы использовать сервис в действии, и во фрагменте в onActivityCreated, чтобы использовать его во фрагменте. У Сервиса будет только один экземпляр. Его можно привязать к сколь угодно большому количеству действий и фрагментов.
Спасибо. Думаю, мне придется это сделать. Я пытался привязаться к службе только один раз в Activity, а затем передать ссылку на эту привязку фрагментам. Но, похоже, возникает гонка между обратным вызовом onActivityCreated () и обратным вызовом onServiceConnected (). Я также могу попробовать привязать к контексту приложения, как описано здесь: stackoverflow.com/questions/15235773/…
Возможный дубликат Связь между Activity и Service