在Android中使用Binder将进度值从“服务”发送到“活动”

时间:2013-10-01 11:44:56

标签: android android-service

我有一个服务下载一些数据,我想将进度值发送到与此服务绑定的活动。

我知道类似问题的可用解决方案:AsyncTask,Messenger和服务的边界活动。我想用有界服务方法实现它。

我发现的所有示例都在服务中创建公共方法,并在将其绑定到服务之后从活动类调用该方法,但我认为在我的情况下,这将需要无限循环来获取频繁的更新值。是否有任何方法可以使服务将数据发送到活动,还有一些方法可以在进度值发生变化时更新UI? (不使用Messenger或AsycTask)

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以在另一个AIDL中定义回调。

package ...;
interface XService {
    ...
    void startX(String path, XServiceCallback callback);
}

并在另一个aidl文件中:

package ...;
interface XServiceCallback {
    void xReady(int errCode, String text);
}

但是回调将以异步方式调用,因此您必须使用Handler.post(Runnable)。

另一种方法是使用Runnable在UI线程上重新发布自己(通过 postDelayed())并轮询进度,比如每0.2秒。

在这两种情况下,您都必须记住服务或客户端可能会死亡。

关于代码,你需要一些远程服务示例(在'net中有很多),并在客户端添加如下内容:

XServiceCallback mServiceCallback = new XServiceCallback.Stub() {
    @Override
    public void xReady(final int errCode, final String text) throws RemoteException {
        handler.post(new Runnable() {
            @Override
            public void run() {
            // use the result
            }
        });
    }
};

您的客户端将此回调传递给服务,服务调用它,您的客户端方法被调用。