Préférence sur l'auditeur de changement

J'ai lu cette publication utile:

SharedPreferences.onSharedPreferenceChangeListener n'est pas appelé de manière cohérente

  • Notifier un service Android lorsqu'un client lié se déconnecte
  • Si android redémarre, un service est onCreate appelé à nouveau?
  • Le service Android se bloque après que l'application a été effacée de la liste des applications récentes
  • Android BroadcastReceiver, service d'exécution automatique après le redémarrage du périphérique
  • Comment être averti lorsque l'activité de premier plan (supérieure) (application) change
  • WiFiDirect discoverServices continue de défaillir avec l'erreur 3 (NO_SERVICE_REQUESTS)
  • Cependant, je n'ai pas de chance. J'essaie de créer un OnSharedPreferenceChangeListener qui s'exécute dans un service. Tout est correctement implémenté mais l'auditeur n'est pas toujours déclenché.

    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); } } 

    METTRE À JOUR

    Le problème découle d'un fait que je n'ai pas mentionné. Je gère deux services et lorsque des modifications de préférence partagées sont effectuées dans MyService2, rien n'est déclenché. Dans le manifeste, je définis les services à exécuter dans différents processus. Existe-t-il un moyen de faire fonctionner cela?

  • ScrollView ne redimensionne pas directement après le changement d'enfant
  • Comment redimensionner une vue personnalisée par programme?
  • Pourquoi la balise viewport sur Galaxy Nexus / Android 4 ne fonctionne-t-elle pas?
  • Problèmes de qualité lors du redimensionnement d'une image au moment de l'exécution
  • WindowSoftInputMode = "adjustResize" ne fonctionne pas avec l'action translucide / navbar
  • Redimensionner Drawable dans Android
  • 3 Solutions collect form web for “Préférence sur l'auditeur de changement”

    Après avoir acquis une certaine expérience avec Android, je suis revenu pour répondre à cette question et aider quelqu'un d'autre qui a des problèmes avec ce type de situation.

    La mise en œuvre de OnSharedPreferenceChangeListener est correcte. Le problème réside dans l'architecture manifeste et d'application. Parce que les services fonctionnent dans différents processus, Android a créé la différence de machines virtuelles Dalvik pour chaque service, par conséquent, ils n'entendent pas les autres auditeurs.

    Ce n'était qu'une mauvaise conception. La meilleure façon d'aborder l'idée de gérer deux services simultanés est de créer un service qui lance chaque service pour exécuter simultanément. De cette façon, ils peuvent partager le même Heap, partageant ainsi les mêmes objets et auditeurs

    Si quelqu'un était déterminé à utiliser deux services, ils pouvaient créer un récepteur BroadcastReceiver pour prendre des mesures pour que ces préférences soient modifiées ou communiquent via des sockets. Il existe également des façons de le faire avec un ContentProvider (NON JAMAIS FAIT CE). Mais encore une fois, il n'y a aucune raison pour cela si la conception est bonne.

    Pourquoi ne pas laisser votre service implémenter OnSharedPreferenceChangeListener ?

    De cette façon, ce n'est pas une classe intérieure anonyme, de sorte qu'il ne reçoit pas de déchets, et vous pouvez toujours faire ce que vous voulez dans le service.

    Je sais que ce fil est vieux. Mais est-ce que quelqu'un a essayé ceci en utilisant MODE_MULTI_PROCESS?

    MODE_MULTI_PROCESS

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.