Android 服务 - 调用方法和传递对象,不绑定

Android service - invoking methods and passing objects, without binding

我有一个应用程序,我需要在其中与另一个应用程序建立和保持蓝牙连接 phone。但是,即使屏幕关闭,此连接也需要保持活动状态。

所以我这样做的方法是 1) 使其成为一项服务,以便连接可以存在于后台,以及 2) 显式调用 start/stop 服务而不是将其绑定到 activity(我相信如果屏幕熄灭,activity 就会消失,因此服务将停止)

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

我读到的关于这个主题的很多内容都是通过绑定服务来解决这个问题的,但是我不能像之前解释的那样这样做

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

好的,这行得通,但是如果我的方法需要我向其中传递一些东西怎么办?例如,假设我有一个列表或我需要通过蓝牙发送的东西。所以我在我的服务中有一个方法,它接受一个列表对象,序列化它并通过 BT 将它发送到另一个 phone。但这对于基本的 messaging/event 总线系统

似乎是不可能的

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

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

时调用方法并传递对象

我在服务中做过类似的事情。有时我需要手动隐藏服务创建的通知。所以我制作了方法 public 和静态方法,这样它就可以像这样在任何地方调用:

public static void hideNotification(){
    notificationManager.cancel(0);
}

然后在您的 activity 中这样调用它:MyService.hideNotification()

编辑

如果您不需要静态方法,您可以为您的服务创建一个空的构造函数,然后当您需要调用该方法时,创建一个新的服务实例并从中调用它。例如:

服务中:

public class MyService extends Service{
    public MyService(){}

    public void hideNotification(){
        notificationManager.cancel(0);
    }
}

当你需要调用一个方法时:

MyService service = new Myservice();
service.hideNotification();