Java Android:将服务传递给处理程序

Java Android:将服务传递给处理程序,java,android,rpc,Java,Android,Rpc,所以,我已经阅读了android文档,对RPC如何在活动和服务之间工作有了大致的了解。然而,对于我的应用程序来说,实现这样的功能似乎太过火了:基本上,我想给服务传递一个好的处理程序,这样它的线程就可以将数据传递给我的活动。目前,我通过使用静态公共成员(hack)来解决这个问题,但我更喜欢在服务的启动意图中传递一个Handler对象。例如,我可以在创建时轻松地将INT传递给我的服务: int x = 0; Intent svc = new Intent(this, MyService.class)

所以,我已经阅读了android文档,对RPC如何在活动和服务之间工作有了大致的了解。然而,对于我的应用程序来说,实现这样的功能似乎太过火了:基本上,我想给服务传递一个好的处理程序,这样它的线程就可以将数据传递给我的活动。目前,我通过使用静态公共成员(hack)来解决这个问题,但我更喜欢在服务的启动意图中传递一个Handler对象。例如,我可以在创建时轻松地将INT传递给我的服务:

int x = 0;
Intent svc = new Intent(this, MyService.class);
svc.putExtra("x",x);
startService(svc);

然而,由于处理程序不能序列化,我还没有找到一种方法在不进行简单的静态成员攻击的情况下将其传递给服务。有什么见解吗?或者,我只是需要接受它并对服务执行正式的RPC吗

如果您的服务和活动处于同一进程中,则可以从服务中传递绑定,而无需执行复杂的RPC操作:

public class MyEasyButNotGoodPracticesBinder {
    public void gimmeHandler(Handler handler) {
        // you got it!
    }
}

IBinder mBinder = new MyEasyButNotGoodPracticesBinder();

public IBinder onBind(Intent intent) {
    return mBinder;
}
然后,在您的活动中,当您获取IBinder对象时,只需将其强制转换为
MyEasyButNotGoodPracticesBinder
,并调用
gimmeHandler(Handler)
方法。现在,我认为这是一种不好的做法,因为如果你想把你的服务放在一个单独的进程中,这样它就不会在整个进程崩溃的情况下崩溃,这就会中断。我也不认为这是未来的证明。但它确实有效


AIDL接口并没有那么难-您可能只想这样做。

Android文档建议在远程messenger服务示例中使用messenger作为客户端接口:

代码示例可以在上面的链接中找到,我想不需要在这里重新发布

问候,, 迈克尔