4

所以,我已经阅读了 android AIDL文档,并且大致了解了 RPC 在 Activity 和 Service 之间的工作方式。但是,对于我的应用程序来说,实现这些功能似乎有些过头了:基本上,我想向 Service 传递一个不错的处理程序,以便它的线程可以将数据传递给我的 Activity。目前我正在通过使用静态公共成员(hack)来解决这个问题,但我更喜欢在服务的起始 Intent 中传递一个 Handler 对象。例如,我可以在创建时轻松地将整数传递给我的服务:

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

但是,由于 Handler 不是可序列化的,我还没有找到一种方法将其传递给服务,而无需简单的静态成员破解。有什么见解吗?或者,我只是不得不接受它并对服务进行正式的 RPC 吗?

4

2 回答 2

4

如果您的 Service 和 Activity 在同一个进程中,您可以从 Service 传递一个 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 对象时,只需将其转换为 aMyEasyButNotGoodPracticesBinder并调用该gimmeHandler(Handler)方法。现在,我认为这是不好的做法,因为如果你想把你的服务放在一个单独的进程中,这样它就不会在崩溃时让整个进程崩溃,这就会中断。我也不认为它是面向未来的。但它确实有效。

AIDL 接口并不难——您可能只想这样做。

于 2009-08-09T22:38:17.147 回答
2

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

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

问候,迈克尔

于 2010-12-03T09:13:36.360 回答