Android服务 - 无需绑定即可调用方法和传递对象

时间:2016-06-06 23:51:00

标签: android android-service android-bluetooth android-broadcast android-broadcastreceiver

我有一个应用程序,我需要建立和维护与另一部手机的蓝牙连接。但是,即使屏幕关闭,此连接也需要保持活动状态。

所以我做这个的方式是1)使它成为一个服务,这样连接可以在后台存在,2)进行显式调用来启动/停止服务而不是将它绑定到活动(I相信如果屏幕熄灭,活动消失,服务将停止)

现在这使事情变得更复杂,因为我的服务有我需要能够手动调用的方法。例如,我想在用户单击按钮时启动蓝牙发现。因此,在按钮单击时,我需要告诉此服务调用我的startDiscovery方法。有很多这样的情况(例如打开套接字,与设备配对等)我需要手动调用服务方法

我在这个主题上阅读的很多内容通过绑定服务来解决这个问题,但我不能像前面所解释的那样做

没有绑定,其他人建议使用某种事件总线,在按钮单击时我向服务发送消息。当它收到消息时,会检查它是什么类型的消息,然后调用适当的方法。

好的,这很有效,但是如果我的方法要求我传递一些内容呢?例如,假设我有一个列表或我需要通过蓝牙发送的东西。所以我在我的服务中有一个方法,它接受一个列表对象,将其序列化并通过BT发送到另一个手机。但对于基本的消息传递/事件总线系统来说,这似乎是不可能的

总之,如何将对象传递给未绑定到活动的服务中的方法,而是通过startService手动启动?

我已经看到了这个问题here,但该方法似乎只允许我在启动服务时发送对象。就我而言,该服务已经启动并处于后台处理蓝牙流量。我需要能够在服务已经运行时调用方法并传递对象

1 个答案:

答案 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();