难以在.aidl文件中仅使用out参数

时间:2012-02-05 05:29:02

标签: android out aidl

我试图让我的Android服务能够将更改发送回Activity,所以我试图只使用参数,因为一旦服务启动,Activity就没有任何内容。< / p>

这是我的.aidl文件:

oneway interface IMyServiceCallback {
    void dataChanged(out double[] info);
    void pathChanged(out List<ParcelableInfo> info);
}

我坚持如何从服务传递数据,以便将其发送到活动。

所以这是在我的服务中,但mCallback中没有任何内容允许我传入参数,然后将这些参数发送回活动。

private final IMyServiceCallback.Stub mCallback = new IMyServiceCallback.Stub() {

    @Override
    public void dataChanged(double[] info) throws RemoteException {
    }

    @Override
    public void pathChanged(List<ParcelableInfo> info) throws RemoteException {
    }

};

所以,我不确定如何调用mCallback.dataChanged(),它会传回new double[] { 1.0, 1.1};

在活动方面,我想要做的是,因为我假设传入的参数是我想从服务中获得的数据。

private IMyServiceCallback mCallback = new IMyServiceCallback.Stub() {
    @Override
    public void dataChanged(double[] info) throws RemoteException {
        mHandler.sendMessage(mHandler.obtainMessage(DATA_MSG, info));
    }

    @Override
    public void pathChanged(
            List<Parcelable> info)
            throws RemoteException {
        mHandler.sendMessage(mHandler.obtainMessage(PATH_MSG, info));
    }
};

我也在使用oneway关键字,因为所有通信都从服务流向活动。

1 个答案:

答案 0 :(得分:1)

您的服务应通过在binder中注册的所有远程回调进行广播:

private final RemoteCallbackList<IMyServiceCallback> remoteCallbacks = new RemoteCallbackList<IMyServiceCallback>();

private void sendNewData(final double[] info)
{
  final int n = remoteCallbacks.beginBroadcast();
  for (int i=0; i<n; i++)
  {
    final IMyServiceCallback callback = remoteCallbacks.getBroadcastItem(i);
    try
    {
      callback.dataChanged(info);
    } 
    catch (RemoteException e)
    {
      Log.e(TAG, "Broadcast error", e);
    }
  }
  remoteCallbacks.finishBroadcast();
}

您可以在API演示中找到完整的示例。