如何通过片段的活动从片段访问服务?

时间:2018-08-15 06:18:58

标签: android android-fragments kotlin android-lifecycle

据我所知,每次创建活动时,我都会很高兴地将其绑定到服务。首次创建活动时,它还会使用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与“活动和服务”有关。我问的是附加到活动的片段,以及它们如何访问活动已绑定的服务。

1 个答案:

答案 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)
}