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

时间:2009-08-09 20:46:46

标签: java android rpc

所以,我已经阅读了android AIDL文档,并大致了解了RPC如何在Activity和Service之间工作。但是,对于我的应用程序来说,实现这些功能似乎太过分了:基本上,我想传递一个很好的处理程序,因此它的线程可以将数据传递给我的Activity。目前我通过使用静态公共成员(一个hack)解决这个问题,但我更喜欢在Service的启动Intent中传递一个Handler对象。例如。我可以在创建时轻松地将注册内容传递给我:

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

然而,由于Handler不能序列化,我没有找到一种方法将它传递给服务而没有简单的静态成员hack。任何见解?或者,我是否只是要把它搞砸并对服务进行正式的RPC?

2 个答案:

答案 0 :(得分:4)

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

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

IBinder mBinder = new MyEasyButNotGoodPracticesBinder();

public IBinder onBind(Intent intent) {
    return mBinder;
}

然后在您的Activity中获取IBinder对象时,只需将其转换为MyEasyButNotGoodPracticesBinder并调用gimmeHandler(Handler)方法。现在,我认为这是不好的做法,因为如果你想把你的服务放在一个单独的进程中,这样它就不会崩溃整个进程如果它崩溃了,这就会破坏。我认为这也不是未来的证据。但它确实有效。

AIDL界面并不难 - 您可能只想这样做。

答案 1 :(得分:1)

Android文档建议在其Remote Messenger服务示例中使用messenger作为客户端界面: Remote Messenger Service Sample

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

此致 迈克尔