1

Androidサービスで変更をアクティビティに返送できるようにしようとしています。サービスが開始されると、アクティビティからは何も送信されないため、パラメータを使用しようとしています。

これが私の.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すべての通信がサービスからアクティビティに流れるため、このキーワードも使用しています。

4

1 に答える 1

1

サービスは、バインダーに登録されているすべてのリモートコールバックを介してブロードキャストする必要があります。

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デモにあります。

于 2012-02-05T15:22:54.540 に答える