所以,我已经阅读了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?
答案 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
代码示例可以在上面的链接中找到,不需要在此重新发布我猜...
此致 迈克尔