1

我是android新手,我必须编写一个服务(在不同的进程上)来处理我的互联网通信功能,我查看了一些博客,发现使用信使我们可以在活动和服务之间进行通信(在不同的进程上),

我的问题在这里,到目前为止我正在做这样的事情:

private Messenger _commandReceiver = new Messenger(new CommandDispatcher());

public IBinder onBind(Intent intent) {
    return _commandReceiver.getBinder();
}

class CommandDispatcher extends Handler {
    public void handleMessage(Message message) {
    int command = data.getInt("command");
    Messenger activityMessenger = (Messenger) data.get("messenger");

    switch (command) {
                case Command.IS_AUTHENTICATED:
        break;
        ...
    }
}
}

但是为什么我不应该在 onBind 方法上发送命令变量和活动信使并在那里处理整个事件,这样可以完全删除服务信使并且通信代码更简单,它会变成这样

public IBinder onBind(Intent intent) {

    Bundle data = intent.getExtras();
    int command = data.getInt("command");
    Messenger activityMessenger = (Messenger) data.get("messenger");

    switch (command) {
                case Command.IS_AUTHENTICATED:
        break;
        ...
    }
}

我知道这可能是一个非常简单的问题,但我无法在任何地方找到答案,所以如果有人能帮助我,我将不胜感激

4

2 回答 2

1

您的问题可能在官方文档中得到解决。

正如谷歌所说,

多个客户端可以同时连接到服务。但是,onBind()只有在第一个客户端绑定时,系统才会调用服务的方法来检索 IBinder。然后系统将相同的 IBinder 传递给绑定的任何其他客户端,而无需onBind() 再次调用。

绑定服务中查找

我的建议是在您添加注册方法以IBinder区分不同的操作。

于 2013-10-09T08:24:45.860 回答
0

扩展 Binder 类 如果您的服务对您自己的应用程序是私有的并且在与客户端相同的进程中运行(这很常见),您应该通过扩展 Binder 类并从 onBind() 返回它的实例来创建接口。客户端收到 Binder 并可以使用它直接访问 Binder 实现甚至服务中可用的公共方法。

当您的服务只是您自己的应用程序的后台工作者时,这是首选技术。您不会以这种方式创建界面的唯一原因是因为您的服务被其他应用程序或跨单独进程使用。

使用 Messenger 如果您需要您的界面在不同的进程中工作,您可以使用 Messenger 为服务创建一个界面。以这种方式,服务定义了一个 Handler 来响应不同类型的 Message 对象。这个 Handler 是 Messenger 的基础,它可以与客户端共享一个 IBinder,允许客户端使用 Message 对象向服务发送命令。此外,客户端可以定义自己的 Messenger,以便服务可以发回消息。

http://developer.android.com/guide/components/bound-services.html

于 2013-02-07T13:39:53.213 回答