我是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;
...
}
}
我知道这可能是一个非常简单的问题,但我无法在任何地方找到答案,所以如果有人能帮助我,我会感激不尽
答案 0 :(得分:1)
您的问题可以在官方文件中解决。
正如谷歌所说,
中找到多个客户端可以立即连接到该服务。然而 系统调用您的服务的
onBind()
方法来检索IBinder 只有当第一个客户绑定时。然后系统提供相同的功能 IBinder到绑定的任何其他客户端,而不调用onBind()
试。
我的建议是在IBinder
添加注册方法,以区别不同的操作。
答案 1 :(得分:0)
扩展Binder类 如果您的服务对您自己的应用程序是私有的并且在与客户端相同的进程中运行(这是常见的),您应该通过扩展Binder类并从onBind()返回它的实例来创建您的接口。客户端接收Binder并可以使用它直接访问Binder实现甚至服务中可用的公共方法。
当您的服务仅仅是您自己的应用程序的后台工作程序时,这是首选技术。您不会以这种方式创建界面的唯一原因是因为您的服务被其他应用程序或单独的进程使用。
使用Messenger 如果您需要您的界面跨不同的进程工作,您可以使用Messenger为服务创建一个界面。通过这种方式,服务定义了一个响应不同类型的Message对象的Handler。此Handler是Messenger的基础,然后可以与客户端共享IBinder,允许客户端使用Message对象向服务发送命令。此外,客户端可以定义自己的Messenger,以便服务可以发回消息。
http://developer.android.com/guide/components/bound-services.html