2016-06-13 32 views
1

Situation:Android: Kommunikation zwischen zwei Dienste von zwei getrennten APKs

Ich habe ein Android System Application (persistent) mit einem Service, die angeblich die ganze Zeit laufen. (Nennen wir es Service A)

Dann gibt es eine andere Anwendung (keine Systemanwendung; normale App), die auch eine Service hat. Aber dieses Service läuft möglicherweise oder läuft möglicherweise nicht, da das Android OS es tötet, wenn es Betriebsmittel benötigt. (Nennen wir es Service B)

Kurz gesagt: Wir haben zwei Anwendungen (daher 2 APKs), die mit demselben Zertifikat signiert werden können. (So ​​konnten sie im selben Prozess richtig laufen?)

Was ich versuche

Der Service A hört Ereignisse zu erreichen. Wenn es ein Ereignis empfängt dann möchte ich den Service A die normale App (Service B) nennen, die

Approaches eine Antwort zurück an Service A. geben sollten die beiden Dienste

kommunizieren zu lassen, konnte ich lassen sie kommunizieren mit:

  • Bindung (unter Verwendung eines AIDL)
  • Messaging (aber nicht optimal, da vorbei komplexer Objekte ist ein Muss)

Probleme

  • Welche Art und Weise ist die „beste“ für den beschriebenen Fall zu kommunizieren?
  • Was passiert, wenn Dienst A eine Nachricht an Dienst B delegieren/senden möchte und Dienst B nicht ausgeführt wird? Es muss eine Antwort von Service B erhalten. Sollte ich Service B immer starten, wenn er nicht ausgeführt wird, wenn Service A ihn anrufen möchte?

Vielen Dank!

+0

, wenn Sie es schnell und komplexe Daten wollen see weitergegeben werden [diese] (http://stackoverflow.com/a/33688843/2252830) – pskink

Antwort

2

Welcher Weg zur Kommunikation ist "der beste" für den beschriebenen Fall?

Sie nennen nur zwei Optionen, da "Aidl" und "Binding" dasselbe sind. Sie verwenden AIDL, um den clientseitigen Proxy und den serverseitigen Stub für die prozessübergreifende Serviceanbindung zu beschreiben und zu implementieren.

Angesichts der Tatsache, dass Sie Call-and-Response möchten, ist die Bindung wahrscheinlich eine bessere Wahl. Beachten Sie jedoch, dass es keinen IPC-Ansatz gibt, der "komplexe Objekte" sehr gut unterstützt, abgesehen von der Verwendung von Parcelable, Serializable oder der Konvertierung des Objektgraphen in JSON oder so.

Was passiert, wenn Dienst A eine Nachricht an Dienst B delegieren/senden möchte und Dienst B nicht ausgeführt wird?

Beim Aufruf startService() oder bindService(), Android Gabeln Verfahren zur App B und erzeugt eine Instanz des Dienstverfahren (seine onCreate() Aufruf). An diesem Punkt ist das Verhalten das gleiche wie wenn der Prozess und der Dienst bereits ausgeführt wurden.

+0

Vielen Dank für Ihre informative Antwort - ich weiß es zu schätzen! Also würden Sie den Service binden und eine AIDL verwenden, um die API zu beschreiben? – sjkm

+0

@sjkm: Ja. Wenn Sie eine synchrone Antwort wünschen, wie bei einem normalen Methodenaufruf, muss Ihre AIDL-Schnittstelle einen Rückgabewert für die Methode definieren. Wenn Sie eine asynchrone Antwort wünschen, definieren Sie AIDL sowohl für Service B als auch für ein Callback-Objekt, das von A übergeben wird. Übergeben Sie dann eine Instanz des Callback-Objekts in der AIDL-definierten Methode, und B kann damit eine Methode aufrufen auf dem Rückruf von A, um die asynchronen Ergebnisse bereitzustellen. Ein Beispiel für den Callback-Ansatz finden Sie unter [diese Beispiel-App] (https://github.com/commonsguy/cw-omnibus/tree/master/Binding/Callback). – CommonsWare

+0

Danke! Das sieht gut aus. Ich werde es mir morgen genauer ansehen. Einen schönen Abend. – sjkm

0

Wenn eine Anwendung, die Service A enthält, eine Systemanwendung ist, wie können dann diese beiden Apps mit demselben Zertifikat signiert werden?

Haben Sie Zugriff auf das Plattformzertifikat?

Anyways AIDL wird eine gute Option sein, da Sie eine Antwort von Service B. wollen

+0

Sie müssen keine App mit dem Plattformzertifikat signieren, damit es eine Systemanwendung ist. Es muss nur im Ordner "/ system/app"/"system/priv-app" installiert werden ... – sjkm