Как вызвать удаленную службу Android (IPC) из виджета / локальной службы?

Я пытаюсь удаленно управлять живыми обоями с помощью виджета. Они находятся в одном APK, но, очевидно, в разных процессах. Вызов "активности" живых обоев мне мало, так как это другой процесс. Виджет имеет простые кнопки, которые при нажатии

Так что (я думаю) мне нужны IPC и AIDL.

Сначала я создал AIDL на стороне обоев, который работал нормально. У него есть три метода без дополнительных параметров. Но когда я добавил клиентскую часть к виджету, я получил сообщение об ошибке, в котором говорилось, что я не могу подключиться к этому удаленному интерфейсу, потому что виджет уже является BroadcastListener. Я попытался включить обработку кнопок, не требуя, чтобы виджет был BroadcastListener, но это оказалось невозможным.

Нет проблем, верно? Я только что создал в виджете службу, которая привязывается к удаленному интерфейсу, потому что, хотя виджет является BroadcastListener, служба - нет, и все должно быть в порядке.

По крайней мере, я так думал.

Ну, я получаю виджет ' s кнопки для запуска службы виджетов. При привязке к удаленной службе появляется следующее предупреждение:

Невозможно запустить службу Intent (act = com.blabla.IRemoteService): not found.

Я использую getApplicationContext () в службе виджета для привязки к удаленный материал. У меня есть служба виджетов в манифесте, но у меня нет удаленной службы. Когда я все же вставляю его туда, я получаю неспецифическое InstantiationException.

В службе виджетов onStart () я делаю следующее:

getApplicationContext().bindService(new Intent(IWallpaperRemote.class.getName()), 
  mConnection, Context.BIND_AUTO_CREATE);

У меня также есть ...

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        mService = IWallpaperRemote.Stub.asInterface(service);
        isBound = true;
        Log.i("WidgetServiceConnection", "binding to service succeeded");
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
        isBound = false;
        Log.i("WidgetServiceConnection", "binding to service lost!");
    }
};

Мой вопрос: успешно ли совершили удаленный вызов из виджета в другое приложение? Учитывая, что я говорю здесь о живых обоях, и тот факт, что я не заинтересован в вызове действия в процессе виджета, но вызываю вызовы функций внутри живых обоев, какие у меня есть варианты, кроме IPC, если они есть?

И если IPC - лучший вариант, что я делаю не так?

5
задан Dan Goldstein 19 February 2011 в 03:41
поделиться