2013-12-18 6 views
9

In meiner App verwende ich einen Kontakt-Sync-Adapter, aber es hat viele Informationen, die es mit der Haupt-App teilt. Es gibt Einstellungen, die der Adapter properly benötigt (wie Login-Informationen und wenn der Benutzer irgendwelche Sync-Einstellungen ändert), so dass ich es derzeit im gleichen Prozess laufen lasse, und es kommuniziert mit dem Haupt-ap mit getApplicationContext(), und dann habe ich einige shared Variablen in der Application, die der Sync-Adapter während des Synchronisierungsprozesses verwendet.Soll in Android ein Kontaktsynchronisierungsadapter in einem separaten Prozess ausgeführt werden?

Aber in der training document, und ein paar Tutorials online, ist der Beispieladapter eingerichtet, um in einem eigenen Prozess zu laufen - es verwendet android:process=":sync" im Manifest. Ist das notwendig? Und wenn es in einem separaten Prozess läuft, wie kann ich zurück zur Haupt-App kommunizieren?

Antwort

2

In unserem Kontext verwenden wir aufgrund der schnellen Suchanforderungen Remote-Service, um eine riesige Datenbank im Speicher zu halten.

Der Grund, warum wir Remotedienst anstelle von lokalem Dienst verwenden, ist, dass wir den Dienst in einem separaten Prozess ausführen, was es schwieriger macht, maximale Speicher pro Prozesslimit zu erreichen (Die Beschränkung hängt von verschiedenen Geräten und Betriebssystemen ab Ausführung).

In unserem ursprünglichen Design verwenden wir AIDL. Später wechseln wir zu Messenger. Ich kann mich nicht an den Grund erinnern. Ich werde unser Quellcode-Verlaufsprotokoll überprüfen, um herauszufinden, warum. Aber ich denke, es ist meistens, Messenger ist weniger kompliziert als AIDL, und wir brauchen nicht die Multi-Thread-Fähigkeit von AIDL zur Verfügung gestellt.

1

Lauf Service in einem eigenen Prozess kann

1) hilfreich sein, wenn Sie Ihren Dienst möchten Ihre wichtigsten App-Prozess Zerstörung zu widerstehen (aber START_STICKY ist mehr als genug für diesen Fall),

2), wenn Sie diesen Vorgang für alle „sync“ Aufgaben Ihrer Anwendung bezeichnen mögen (wie in den tutorial angegeben),

3) Wenn Sie möchten, dass andere Apps Ihren Dienst nutzen.

Zur Kommunikation mit dem Service, der in einem separaten Prozess ausgeführt wird, verwenden Sie Bound Services.

Wenn Sie den Dienst jedoch in einem separaten Prozess ausführen, erhöht sich die Komplexität der Kommunikation mit ihm. Berücksichtigen Sie daher, ob sich einer der oben genannten Fälle auf Ihre App bezieht.

+1

Wird es in einem separaten Prozess ausgeführt, um die Verlangsamungen zu beseitigen, die entstehen, wenn eine große Anzahl von Kontakten synchronisiert werden muss? Im Moment passiert das für Benutzer, die 5000+ Kontakte synchronisieren. – user496854

+0

Um Verlangsamungen zu vermeiden, führen Sie einfach die Synchronisierung in einem [separaten Thread] aus (http://developer.android.com/guide/components/processes-and-threads.html#Threads). Aus diesem Grund müssen Sie nicht in einen separaten Prozessoverhead einsteigen . –

+0

Ist kein Sync-Adapter in einem separaten Thread ziemlich sinnlos? PreformSync wird beendet, während der Thread noch ausgeführt wird, wodurch der Dienst beendet wird und der Thread verloren geht. Darüber hinaus wird der Sync-Adapter die Synchronisierung als abgeschlossen markieren, aber es ist wirklich nicht, und das könnte zu großen Problemen führen. – user496854

0

Ich denke, es sollte getrennt werden, aber es ist nicht erforderlich.

Generell ist die Trennung eines Service Prozesses zu beachten, wenn dieser unabhängig von Systemkomponenten oder anderen Anwendungen verwendet werden kann. In dieser Perspektive sollte der Lebenszyklus des Prozesses unabhängig von anderen Komponenten wie Activity in der gleichen App verwaltet werden, damit Android markieren kann, welcher Prozess gerade verwendet wird und einfach und präzise entscheidet, welcher Prozess im Falle eines Speichermangels beendet werden soll. Der Dienst kann auch dann ausgeführt werden, wenn die Frontaktivität unerwartet abstürzte.

Es ist schwierig, die gemeinsame Nutzung von Daten zwischen separaten Prozessen zu gewährleisten. Für Login-Daten und Einstellungen denke ich, dass Sie mit einer Kombination von SharedPreferences und OnSharedPreferenceChangeListener gehen können.

0

Wenn die Anwendung gestartet wird, können verschiedene Dinge zwischengespeichert werden, insbesondere für die Benutzeroberfläche. Indem Sie die Synchronisierungslogik in einem anderen Prozess aufteilen, ermöglichen Sie, dass der UI-Prozess abgebrochen wird, wenn das Gerät zu wenig Arbeitsspeicher zur Verfügung hat. Dadurch werden diese UI-Caches freigegeben.

Daher ist diese Technik in erster Linie von Interesse für Anwendungen, die Dienste für eine lange Zeit ausführen. Typische Beispiele:

  • der Dienst, die Musik in einer Musik-App
  • den Dienst, der das Video in Youtube hochgeladen spielt

jedoch:

  • dies die Komplexität der Anwendung erhöht
  • Wenn dies nicht richtig durchgeführt wird, kann es tatsächlich den Gesamtspeicherbedarf der App
  • erhöhen
Verwandte Themen