我有一个应用程序,我需要建立和维护与另一部手机的蓝牙连接。但是,即使屏幕关闭,此连接也需要保持活动状态。
所以我做这个的方式是1)使它成为一个服务,这样连接可以在后台存在,2)进行显式调用来启动/停止服务而不是将它绑定到活动(I相信如果屏幕熄灭,活动消失,服务将停止)
现在这使事情变得更复杂,因为我的服务有我需要能够手动调用的方法。例如,我想在用户单击按钮时启动蓝牙发现。因此,在按钮单击时,我需要告诉此服务调用我的startDiscovery
方法。有很多这样的情况(例如打开套接字,与设备配对等)我需要手动调用服务方法
我在这个主题上阅读的很多内容通过绑定服务来解决这个问题,但我不能像前面所解释的那样做
没有绑定,其他人建议使用某种事件总线,在按钮单击时我向服务发送消息。当它收到消息时,会检查它是什么类型的消息,然后调用适当的方法。
好的,这很有效,但是如果我的方法要求我传递一些内容呢?例如,假设我有一个列表或我需要通过蓝牙发送的东西。所以我在我的服务中有一个方法,它接受一个列表对象,将其序列化并通过BT发送到另一个手机。但对于基本的消息传递/事件总线系统来说,这似乎是不可能的
总之,如何将对象传递给未绑定到活动的服务中的方法,而是通过startService
手动启动?
我已经看到了这个问题here,但该方法似乎只允许我在启动服务时发送对象。就我而言,该服务已经启动并处于后台处理蓝牙流量。我需要能够在服务已经运行时调用方法并传递对象
答案 0 :(得分:0)
我在服务中做了类似的事情。有时我需要手动隐藏服务创建的通知。所以我将方法设为public和static,因此可以像这样调用它:
public static void hideNotification(){
notificationManager.cancel(0);
}
然后在您的活动中调用它:MyService.hideNotification()
修改强>
如果您不想要静态方法,可以为服务创建一个空构造函数,然后在需要调用该方法时,创建一个新的服务实例并从中调用它。例如:
在服务中:
public class MyService extends Service{
public MyService(){}
public void hideNotification(){
notificationManager.cancel(0);
}
}
当您需要调用方法时:
MyService service = new Myservice();
service.hideNotification();