据我所知,每次创建活动时,我都会很高兴地将其绑定到服务。首次创建活动时,它还会使用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属性mAudioRecorderService尚未初始化
据我所知,片段中的onActivityCreated()与活动中的onCreate()竞争,并试图在onCreate()初始化它之前获取引用。
我不了解。我以为onActivityCreated()等到 onCreate()完成之后。
我在做什么错?我应该在片段中使用某种仅在活动绑定到服务时才触发的回调吗?我已经提到过这一点,但是我不知道该怎么做。
问题Communication between Activity and Service与“活动和服务”有关。我问的是附加到活动的片段,以及它们如何访问活动已绑定的服务。
答案 0 :(得分: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)
}