Präferenz Auf Change Listener
Habe ich gelesen, diesen hilfreichen Beitrag :
SharedPreferences.onSharedPreferenceChangeListener nicht aufgerufen wird, konsequent
Aber ich habe kein Glück. Ich bin versucht, zu erstellen eine OnSharedPreferenceChangeListener läuft in einem service. Alles richtig umgesetzt wird, aber der Hörer wird nicht immer ausgelöst.
public MyServiceOne extends Service {
public SharedPreferences mSharedPreferences;
//Listener defined by anonymous inner class.
public OnSharedPreferenceChangeListener mListener = new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.d("debug", "A preference has been changed");
}
};
@Override
public void onCreate() {
mSharedPreferences = getSharedPreferences(MySharedPreferences.NAME, Context.MODE_PRIVATE);
mSharedPreferences.registerOnSharedPreferenceChangeListener(mListener);
}
@Override
public void onDestroy() {
super.onDestroy();
mSharedPreferences.unregisterOnSharedPreferenceChangeListener(mListener);
}
}
UPDATE
Dem problem ergibt sich aus einer Tatsache, die ich nicht erwähnt habe. Ich bin mit zwei von Dienstleistungen und beim gemeinsamen Vorliebe Veränderungen in MyService2 nichts ausgelöst. Im manifest definiere ich die Dienste in verschiedenen Prozessen ausgeführt werden. Gibt es eine Möglichkeit, diese Arbeit zu machen?
InformationsquelleAutor jjNford | 2011-11-01
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach der Erlangung der einige Erfahrung mit Android habe ich kommen Sie zurück, um diese Frage zu beantworten und helfen, jemand anderes, die Probleme mit dieser Art von situation.
Die Umsetzung der OnSharedPreferenceChangeListener korrekt ist. Das problem liegt in der manifest-und Anwendungsarchitektur. Da die Dienste laufen in verschiedenen Prozessen Android geschaffen hat, Unterschied Dalvik Virtuelle Maschinen für jeden service, damit Sie nicht "hören" jeden anderen Hörer.
Das war einfach schlechtes design - Der bessere Weg, um Ansatz die Idee, die zwei gleichzeitige services zu schaffen, ist ein service, der jedes threads "service" aus, um gleichzeitig ausgeführt werden. Auf diese Weise können Sie teilen sich die gleichen Heap somit teilen die gleichen Objekte & Hörer
Wenn jemand entschlossen waren, verwenden Sie zwei Dienstleistungen, die Sie schaffen könnte ein BroadcastReceiver zu fangen Absichten für Sie, dass Einstellungen geändert werden müssen - oder die Kommunikation über sockets. Es gibt auch Möglichkeiten, dies zu tun mit einem ContentProvider (Bitte nicht TUN). Aber nochmal, es gibt keinen Grund für irgendwelche von diesem, wenn das design gut ist.
Warum nicht lassen Sie Ihre service implementieren
OnSharedPreferenceChangeListener
?Dass wie es nicht eine anonyme innere Klasse, damit es nicht bekommen, garbage Collection, und Sie können weiterhin tun, was Sie wollen, in den Dienst.
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
?Application
Klasse derOnSharedPreferenceChangedListener
? Das kann man übrigens auch hören, wenn Sie eine Präferenz geändert wird und die PreferenceActivity ist nicht aktiv.Ich weiß, dieser thread ist alt. Aber hat jemand versucht, dies mit MODE_MULTI_PROCESS?
MODE_MULTI_PROCESS