android - 如何通过片段的活动从片段访问服务?
问题描述
据我所知,我有一个活动,每次创建活动时都会愉快地绑定到服务。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 已经绑定到的服务。
解决方案
调用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)
}
推荐阅读
- node.js - 表达我如何获取标题的值
- css - 如何为 React JS 中的新组件创建新的 CSS 文件?
- php - 如何从 PHP 多维数组中的值中获取最大值?
- python - 如何仅检索 args 列表中的非负值(理解)?
- python - 如何以格式(mm-dd-yyyy)在 django 模型中创建日期字段
- react-native - 应用程序剪辑大小对于本机应用程序来说太大了
- laravel - Livewire\Exceptions\ComponentNotFoundException - 无法找到组件:[Livewire.Tasks-Board]
- java - 在Java中将值从较大的数组复制到较小的数组
- range - 在 WinBugs 模型中定义一个具有不同上界的范围
- python - plt.show() 在 Anaconda 上的环境中不起作用