Сложность использования только параметров в файле.aidl

Я пытаюсь сделать так, чтобы моя служба Android могла просто отправлять изменения обратно в Activity, поэтому я пытаюсь просто использовать параметры, поскольку ничего не происходит из Activity после запуска службы.

Вот мой файл.aidl:

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

Я застрял на том, как передать данные из службы, чтобы они были отправлены в активность.

Так что это в моем Сервисе, но в mCallback нет ничего, что позволило бы мне передать параметры, которые затем будут отправлены обратно в Activity.

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 ответ

Решение

Ваша служба должна транслироваться через все удаленные обратные вызовы, зарегистрированные в 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.

Другие вопросы по тегам