In meiner App verwende ich einen Kontaktsynchronisierungsadapter, der jedoch viele Informationen mit der Hauptanwendung teilt. Es gibt Einstellungen, die der Adapter benötigt, um zu arbeiten (wie Login-Informationen und wenn der Benutzer irgendwelche Synchronisierungseinstellungen ändert), so dass ich ihn zur Zeit im selben Prozess laufen lasse, und er kommuniziert mit dem Haupt-AP mit getApplicationContext()
und dann ich Haben Sie einige freigegebene Variablen in Application
, die der Sync-Adapter während des Synchronisierungsprozesses verwendet.
Aber im Schulungsdokument und ein paar Tutorials online Der Beispieladapter ist so eingerichtet, dass er in einem eigenen Prozess ausgeführt wird. Er 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?
In unserem Kontext verwenden wir aufgrund der schnellen Suchanforderungen Remote-Service, um eine riesige Datenbank im Speicher zu halten.
Der Grund für die Verwendung von Remote-Service anstelle von lokalem Service besteht darin, dass wir die Ausführung des Service in einem separaten Prozess erschweren werden, um den maximalen Speicher pro Prozesslimit zu erreichen. Die Beschränkung hängt von verschiedenen Geräten und der Betriebssystemversion ab ).
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 Multithread-Funktion, die von AIDL
bereitgestellt wird.
Das Ausführen von Service
in einem eigenen Prozess kann hilfreich sein
1) Wenn Ihr Service der Prozesszerstörung Ihrer Hauptanwendung standhalten soll (aber START_STICKY
ist mehr als genug für diesen Fall),
2) Wenn Sie diesen Prozess für alle "Synchronisierungs" -Tasks Ihrer Anwendung festlegen möchten (wie in Lernprogramm ),
3) , wenn Sie möchten, dass andere Apps Ihren Dienst nutzen.
Um mit dem Service
in einem separaten Prozess zu kommunizieren, verwenden Sie Gebundene Dienste .
Wenn Sie den Dienst jedoch in einem separaten Prozess ausführen, erhöht sich die Komplexität der Kommunikation mit ihm. Überlegen Sie also, ob sich einer der oben genannten Fälle auf Ihre App-Zwecke bezieht.
Ich denke, es sollte getrennt werden, aber es ist nicht erforderlich.
Im Allgemeinen lohnt es sich, einen Prozess Service
zu trennen, wenn er 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, um einfach und präzise entscheiden zu können, welcher Prozess im Falle eines Speichers beendet werden soll Mangel. Außerdem kann der Dienst auch dann ausgeführt werden, wenn die Frontaktivität unerwartet abstürzte.
Es ist schwierig, die gemeinsame Nutzung von Daten zwischen einzelnen Prozessen zu gewährleisten. Für Login-Daten und Einstellungen denke ich, dass Sie eine Kombination aus SharedPreferences
und OnSharedPreferenceChangeListener .
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 beendet wird, wenn das Gerät nicht mehr genügend Arbeitsspeicher zur Verfügung hat. Dadurch werden diese UI-Caches freigegeben.
Daher ist diese Technik in erster Linie für Apps interessant, die Dienste für eine lange Zeit ausführen. Typische Beispiele:
Allerdings:
Tags und Links android android-syncadapter contacts sync