MODE_MULTI_PROCESS für SharedPreferences funktioniert nicht

Ich habe einSyncAdapter separat vom Hauptprozess der App ausgeführt werden.

Ich verwende eine statische Wrapper-Klasse um meineSharedPreferences das erzeugt ein statisches Objekt beim Laden des Prozesses (Application'sonCreate) wie folgt:

myPrefs = context.getSharedPreferences(MY_FILE_NAME, Context.MODE_MULTI_PROCESS | Context.MODE_PRIVATE);

Der Wrapper hat folgende get- und set-Methoden:

public static String getSomeString() {
    return myPrefs.getString(SOME_KEY, null);
}

public static void setSomeString(String str) {
    myPrefs.edit().putString(SOME_KEY, str).commit();
}

BeideSyncAdapter und app benutzt diese wrapper klasse um die einstellungen zu bearbeiten und abzurufen, das funktioniert manchmal aber oft sehe ich dasSyncAdapter Erhalten von alten / fehlenden Einstellungen beim Zugriff auf die Einstellungen, während die Haupt-App die letzten Änderungen richtig sieht.

Nach den Unterlagen denke ich dasMODE_MULTI_PROCESS flag sollte so funktionieren, wie ich es erwartet habe, sodass beide Prozesse die neuesten Änderungen sehen können, aber es funktioniert nicht.

Aktualisieren:

Prox90Ich habe versucht, auf eine statische Aufladung zu verzichtenSharedPreferences Objekt und stattdessen aufrufengetSharedPreferences bei jeder get / set-Methode. Dies verursachte ein neues Problem, bei dem die Voreinstellungsdatei beim gleichzeitigen Zugriff auf mehrere Prozesse gelöscht wird (!!!). ich sehe im logcat:

(process 1): getName => "Name"
(process 2): getName => null
(process 1): getName => null

und von diesem Punkt an alle Einstellungen auf demSharedPreferences Objekt wurde gelöscht.

Dies ist wahrscheinlich das Ergebnis einer anderen Warnung, die ich im Protokoll sehe:

W/FileUtils(21552): Failed to chmod(/data/data/com.my_company/shared_prefs/prefs_filename.xml): libcore.io.ErrnoException: chmod failed: ENOENT (No such file or directory)

PS: Dies ist kein deterministisches Problem. Ich habe die obigen Protokolle nach einem Absturz gesehen, konnte sie aber noch nicht auf demselben Gerät neu erstellen, und es schien bisher auf anderen Geräten nicht vorzukommen.

EIN ANDERES UPDATE:

Ich habe einen Fehlerbericht dazu eingereicht, nachdem ich eine kleine Testmethode geschrieben habe, um zu bestätigen, dass es sich tatsächlich um ein Android-Problem handelthttps://code.google.com/p/android/issues/detail?id=66625

Antworten auf die Frage(6)

Ihre Antwort auf die Frage