【问题标题】:Android: Passing a Service a HandlerAndroid:将服务传递给处理程序
【发布时间】:2010-11-18 03:27:42
【问题描述】:

所以,我已经阅读了 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 不是可序列化的,我还没有找到一种方法将其传递给服务,而无需简单的静态成员 hack。有什么见解吗?或者,我只是不得不接受它并对服务进行正式的 RPC 吗?

【问题讨论】:

    标签: java android rpc


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      问候, 迈克尔

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-19
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多