Сложность использования только параметров в файле.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.