从活动绑定到服务或在不同的进程中启动服务?

时间:2010-11-23 11:44:09

标签: android service

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

应该采取什么样的合适方式?如果我仅从一个Activity绑定服务,那么该服务将仅与该Activity通信。那么,我是否需要采用基于AIDL的方法或者还有其他方法吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

  

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

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

  

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

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

希望这能回答你的问题!

答案 1 :(得分:0)

您可以直接绑定到服务,如上面的答案所述,但不需要信使。您的服务将在99.9%的时间内以与您的活动相同的流程运行。信使被设计用于进程间通信(IPC)。也不需要AIDL - 专为高级IPC设计。

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