Preference On Change Listener

8

Ich habe diesen hilfreichen Beitrag gelesen:

SharedPreferences.onSharedPreferenceChangeListener wird nicht konsistent aufgerufen

Aber ich habe kein Glück. Ich versuche, einen OnSharedPreferenceChangeListener zu erstellen, der in einem Dienst ausgeführt wird. Alles ist korrekt implementiert, aber der Listener wird nicht immer ausgelöst.

%Vor%

AKTUALISIEREN

Das Problem rührt von einer Tatsache her, die ich nicht erwähnt habe. Ich führe zwei Dienste aus und wenn in MyService2 Änderungen an der gemeinsamen Einstellung vorgenommen werden, wird nichts ausgelöst. Im Manifest definiere ich die Dienste, die in verschiedenen Prozessen laufen sollen. Gibt es eine Möglichkeit, dies zum Funktionieren zu bringen?

    
jjNford 01.11.2011, 14:34
quelle

3 Antworten

8

Nachdem ich einige Erfahrungen mit Android gesammelt habe, bin ich zurückgekommen, um diese Frage zu beantworten und anderen zu helfen, die Probleme mit dieser Art von Situation haben.

Die Implementierung von OnSharedPreferenceChangeListener ist korrekt. Das Problem liegt in der Manifest- und Anwendungsarchitektur. Da die Dienste in verschiedenen Prozessen laufen, hat Android für jeden Dienst eine Dalvik Virtual Machine erstellt, daher hören sie sich nicht gegenseitig an.

Dies war nur ein schlechtes Design - Der bessere Weg, die Idee der Ausführung von zwei gleichzeitigen Diensten anzugehen, besteht darin, einen Dienst zu erstellen, der jeden "Dienst" für den gleichzeitigen Betrieb abtrennt. Auf diese Weise können sie denselben Heap teilen und teilen somit dieselben Objekte & amp; Listener

Wenn jemand bestimmt war, zwei Dienste zu verwenden, könnten sie einen BroadcastReceiver erstellen, um Absichten zu erfassen, damit Präferenzen geändert werden müssen - oder über Sockets kommunizieren. Es gibt auch Möglichkeiten, dies mit einem ContentProvider zu tun (bitte TUN SIE DIES NICHT). Aber auch hier gibt es keinen Grund, wenn das Design gut ist.

    
jjNford 01.03.2012, 14:38
quelle
0

Warum lassen Sie Ihren Service OnSharedPreferenceChangeListener nicht implementieren?

Auf diese Weise handelt es sich nicht um eine anonyme innere Klasse, daher wird kein Müll gesammelt und Sie können immer noch tun, was Sie wollen.

    
Lars 01.11.2011 14:37
quelle
0

Ich weiß, dass dieser Thread alt ist. Aber hat jemand das mit MODE_MULTI_PROCESS versucht?

MODE_MULTI_PROCESS

    
WoodsLink 31.08.2014 02:13
quelle