我想在服务中进行蓝牙连接。活动和服务之间需要互动。应用程序启动后应立即启动该服务,并且应该能够在某些情况下与UI活动进行通信。
应该采取什么样的合适方式?如果我仅从一个Activity绑定服务,那么该服务将仅与该Activity通信。那么,我是否需要采用基于AIDL的方法或者还有其他方法吗?
否则,我可以有一个扩展Application类的类,然后从那里启动服务并绑定Application类吗?
答案 0 :(得分:1)
这是一个相当广泛的问题,所以我会尽我所能回答。根据我所知的服务,多个活动可以绑定单个服务,所有服务都可以访问它。只有当绑定服务的所有活动结束其连接(通过解除绑定)时,服务才会实际停止。
关于服务的android文档告诉我们:
...系统将保持服务运行,只要它启动或与Context.BIND_AUTO_CREATE标志有一个或多个连接。一旦这些情况都不成立,就会调用服务的onDestroy()方法并且服务被有效终止
所以我的建议是将服务与需要与之通信的所有活动绑定。绑定服务时,将返回IBinder,您可以使用它与服务进行通信。再次根据服务的Android文档:
通常返回的IBinder是针对一个用aidl编写的复杂接口。
虽然如果您只需要与服务进行简单的通信,您可以使用Messenger类而不是编写完整的AIDL文件。可以找到here的示例。
希望这能回答你的问题!
答案 1 :(得分:0)
您可以直接绑定到服务,如上面的答案所述,但不需要信使。您的服务将在99.9%的时间内以与您的活动相同的流程运行。信使被设计用于进程间通信(IPC)。也不需要AIDL - 专为高级IPC设计。
相反,您应该使用:BroadcastReceivers和Intents。这就是它们的设计目标(应用程序中组件之间的通信)。