首页 > 解决方案 > 如何通过片段的活动从片段访问服务?

问题描述

据我所知,我有一个活动,每次创建活动时都会愉快地绑定到服务。Activity第一次创建的时候,也会用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() 完成后

我究竟做错了什么?我是否应该在片段中使用某种回调,仅在活动绑定到服务时触发?我已经看到提到这一点,但我不知道该怎么做。

活动和服务之间的通信问题涉及活动和服务。我在询问附加到 Activity 的 Fragments,以及它们如何访问 Activity 已经绑定到的服务。

标签: androidandroid-fragmentskotlinandroid-lifecycle

解决方案


调用bindService后服务不直接可用。使用服务连接。当 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)
}

推荐阅读