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

  • Comment puis-je obtenir le contexte de l'application à partir d'un service Android?
  • Android - Service d'arrière-plan périodique - Conseil
  • Empêche certains utilisateurs de fermer le service Android
  • Comment empêcher que le service ne s'exécute à nouveau s'il exécute déjà Android
  • Comment faire suivre un service?
  • Android BroadcastReceiver, service d'exécution automatique après le redémarrage du périphérique
  • 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
  • Animation du mode de redimensionnement dans la conception des matériaux
  • Scalez le texte dans une vue appropriée?
  • Redimensionner Drawable dans Android
  • Android ImageView ajustant la hauteur du parent et l'épaisseur du raccord
  • Comment redimensionner une vue personnalisée par programme?
  • 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.