So rufen Sie ein Android-remote-service (IPC) aus einer Widget / local service?
Ich versuche, remote-control eine live wallpaper von einem widget. Sie sind in der gleichen APK, aber offensichtlich unterschiedliche Prozesse. Aufruf einer "Aktivität" von der live-Tapete ist von wenig nutzen für mich, da es ist ein anderer Prozess. Das widget verfügt über einfache Knöpfe, die, wenn Sie gedrückt,
So was (glaube ich) ich brauche, ist IPC und AIDL.
Zuerst habe ich die AIDL auf der Tapete-Seite, die gut geklappt hat. Es hat drei Methoden, mit keine zusätzlichen Parameter. Aber wenn ich fügte hinzu, die clientseitiger auf das widget, ich bekam eine Fehlermeldung sagt mir, dass ich keine Bindung an die remote-Schnittstelle, da das widget ist bereits ein BroadcastListener. Ich versuchte, Knopf-handling, ohne das Widget zu sein BroadcastListener, aber das scheint unmöglich zu sein.
Gut kein problem, oder? Ich habe gerade einen service kreiert, in der widget, der an das remote-interface, da während der widget ist ein BroadcastListener, ist der Dienst nicht, und alles sollte in Ordnung sein.
Oder so dachte ich.
Gut, ich bin immer der widget-Tasten, um trigger-widget-service. Die Bindung an die remote-service ergibt mir folgende Warnung:
Unable to start service Vorsatz (act=Kom.blabla.IRemoteService): nicht gefunden.
Ich bin mit getApplicationContext() innerhalb des service des widgets zu binden, um die remote-Zeug. Ich habe das widget service im manifest, aber ich habe nicht das remote-service gibt. Wenn ich es, ich bekomme eine unspezifische InstantiationException.
In der Widget Service onStart() ich bin, dies zu tun:
getApplicationContext().bindService(new Intent(IWallpaperRemote.class.getName()),
mConnection, Context.BIND_AUTO_CREATE);
Ich auch haben...
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!");
}
};
Meine Frage ist: Hat jemand schon einmal erfolgreich getan, die einen remote-Aufruf von einem widget in eine andere Anwendung? Bedenkt, ich Rede ein live wallpaper ist hier, und die Tatsache, dass ich bin nicht daran interessiert, den Aufruf einer Aktivität innerhalb des widget-Prozess, aber die Ursache Funktionsaufrufe in der live-wallpaper, welche Möglichkeiten habe ich, andere als die IPC, wenn überhaupt?
Und wenn die IPC ist der Weg zu gehen hier, was mache ich falsch?
- ~ "Sie sind in der gleichen APK, aber offensichtlich unterschiedlichen Prozessen." Sie absolut nicht brauchen, um separate Prozesse, wenn Sie in der gleichen APK!
- AFAIK kann man nicht ein widget haben auch eine live-Tapete. Wie soll das funktionieren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich die Antwort auf meine eigene Frage. Dinge einfacher zu machen für andere, hier die Lösung:
Wenn Sie einen remote-service, eine zu schreiben, hat das AIDL, die kompiliert werden, die in eine Art stub-Schnittstelle, die Implementierung der Schnittstelle (also der code, der ausgeführt wird, wenn jemand ruft die remote-Methoden), und eine Klasse, die Sie erweitert "Service" liefert die Implementierung der Klasse in der onBind () - Methode. (Ein normaler lokaler Dienst zurückkehren würde null in Methode)
Nun, was ich nicht verstanden hatte ist, dass MÜSSEN Sie eine service-definition in der manifest - MIT VORSATZ-FILTER!
Lassen Sie uns sagen, dass Ihre AIDL heißt IRemoteService.aidl, dann haben Sie eine Klasse namens RemoteService, die wie folgt aussieht:
In Ihrem android-manifest, Sie wollen diese:
Hinweis: der Dienstname: Es ist "RemoteService", nicht "IRemoteService" oder sogar "RemoteServiceImpl". Sie müssen den Namen der Klasse, die Sie erweitert "Service", dessen onBind-Methode, die wir überschrieb.
Abschließen der Sache, hier der code auf der client-Seite -und ja, dieser code funktioniert auch in einer anderen Dienstes, zum Beispiel einer Sie begann von Ihrem widget 😉
...wo RemoteServiceConnection kann eine innere Klasse in etwa so:
Und jetzt sind Sie frei zu nennen..
Zusammenfassend: achten Sie darauf, einen service Zeilengruppe in der android-manifest-set "name" der Klasse zurückgibt, die die tatsächliche Umsetzung in seiner onBind () - Methode, und man muss ein intent-filter mit einer Aktion Definition dass die Punkte des AIDL-interface.
Hinweis: Wenn Sie den Aufruf von remote-services aus einer app in einer anderen APK, fügen Sie eine "Kategorie" - element, um die Absicht filter zu, und legen Sie es auf die STANDARDEINSTELLUNGEN.