android - 服务绑定(bind)链

标签 android android-service android-service-binding

我的应用程序面临一个新问题,我有三个不同的 Android 服务。

  • LibService:这是从我正在使用的库公开的服务,它连接到 BLE 传感器并允许 Android 设备从它们接收数据。
  • ConnectionService:这是我在我的应用程序的库模块中创建的服务,它绑定(bind)到 LibService 并负责维护与 BLE 的连接传感器。
  • TaskService:此服务在我的应用程序模块中创建,负责使用从传感器接收的数据计算不同的任务。该服务绑定(bind)到 ConnectionService 以接收数据。

我面临的问题是如何同步这三个服务的绑定(bind)链。当我绑定(bind)到 TaskService 时,这又绑定(bind)到 ConnectionService,后者又绑定(bind)到 LibService。几乎总是第一个服务连接,即 TaskService 和 ConnectionService 之间的连接,在 ConnectionService 和 LibService 之间的连接之前被解析。结果,当我在 TaskService 中使用 ConnectionService 绑定(bind)器时,我得到一个 NullPointerException,因为 ConnectionService 还没有 LibService 绑定(bind)器。

我尝试使用锁来防止 ConnectionService 在检索到 LibService Binder 之前返回 Binder ,但这会导致应用程序阻塞,因为服务连接是在主线程上执行的,从而阻止它解析第二个服务连接。

解决问题的正确方法是什么? 谢谢

最佳答案

这种架构在Android中有点难度。我的建议是您有一个额外的“就绪”通知消息,由每个 Service 成功建立自己的绑定(bind)和其他资源后发送给它的绑定(bind)客户端.您可以通过使用从 Service 返回其客户端的广播 Intent 来实现此目的,或者您可以使用双向(回调)通信,具体取决于通信方式您已经在您的服务和他们的客户之间实现的方法。

“就绪通知”应该在客户端绑定(bind)后发送,直到客户端收到它需要“等待”的“就绪通知”(这可以通过显示进度通知或进度对话框或“正在初始化.. ."对话框或动画或任何让用户保持忙碌的东西。

关于android - 服务绑定(bind)链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48519849/

相关文章:

Android – 监听传入的 SMS 消息

android - 如何在 onHandleIntent() 完成时不结束 Android IntentService?

android - bindService 无法使用 BIND_AUTO_CREATE 启动服务

android - Android Espresso 包 `android.support.test.espresso.intent` 的依赖项是什么?

android - Phonegap-从www文件夹加载mp3

android - 如何在双卡 Android 手机中找到来电的目标卡?

android - IAE : Service not registered on unbindService after Service. stopSelf

java - 我应该绑定(bind)我的服务还是多次调用 startService ?

android - AVD的窗口没有出现

android - 使用批处理文件在 linux shell 中运行命令