Сложность использования только параметров в файле .aidl - PullRequest
1 голос
/ 05 февраля 2012

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

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

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

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

Так что это в моем Сервисе, но в 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 Ответ

1 голос
/ 05 февраля 2012

Ваша служба должна транслироваться через все удаленные обратные вызовы, зарегистрированные в связывателе:

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.

...