【问题标题】:Binding to Service from Activity or starting service in different process?从 Activity 绑定到服务或在不同进程中启动服务?
【发布时间】:2010-11-23 11:44:09
【问题描述】:

我想在服务中进行蓝牙连接。并且需要在活动和服务之间进行交互。该服务应该在应用程序启动后立即启动,并且应该能够在某些情况下与 UI 活动进行通信。

应该采取什么适当的方法?如果我仅从一个 Activity 绑定服务,则该服务将仅与该 Activity 进行通信。那么,我需要采用基于 AIDL 的方法还是有其他解决方法?

否则,我可以有一个扩展 Application 类的类,然后从那里启动服务并绑定 Application 类吗?

【问题讨论】:

    标签: android service


    【解决方案1】:

    这是一个相当广泛的问题,所以我会尽我所能回答。根据我对服务的了解,多个活动可以绑定一个服务,所有人都可以访问它。只有绑定服务的所有活动结束其连接(通过解除绑定),服务才会真正停止。

    关于服务的 android 文档告诉我们:

    ...只要服务启动,系统就会保持服务运行有一个或多个使用 Context.BIND_AUTO_CREATE 标志的连接。一旦这两种情况都不成立,就会调用服务的 onDestroy() 方法并有效地终止服务

    所以我的建议是将服务与需要与之通信的所有活动绑定。与服务绑定时,将返回一个 IBinder,您可以使用它与服务进行通信。再次根据有关服务的 Android 文档:

    通常返回的 IBinder 是针对用aidl 编写的复杂接口的。

    虽然如果您只需要与服务进行简单的通信,您可以使用Messenger 类而不是编写完整的 AIDL 文件。可以在here 找到一个示例。

    希望这能回答你的问题!

    【讨论】:

      【解决方案2】:

      您可以按照上述答案直接绑定到服务,但不需要 Messenger。您的服务将在 99.9% 的时间内与您的活动在同一进程中运行。 Messenger 是为进程间通信(IPC)而设计的。也不需要 AIDL - 专为高级 IPC 设计。

      相反,您应该使用:BroadcastReceiversIntents。这就是它们的设计目的(应用程序中组件之间的通信)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多