SharedPreferencesChangeListener不起作用

时间:2016-11-26 05:28:37

标签: android sharedpreferences android-sharedpreferences

SharedPrefencesChangeListener在此代码中不起作用。请指出是否遗漏了任何内容。

我想知道它是否正在发生,因为我已在服务中宣布它。

从另一项活动更改SharedPreferences的代码:

getSharedPreferences("TRACKER", Context.MODE_PRIVATE).edit().putString("TRIP_LIST", String.valueOf(trip_list)).apply();

///

package com.tracker;

import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;

import org.json.JSONException;
import org.json.JSONObject;

public class SharedPrefMonService extends Service implements SharedPreferences.OnSharedPreferenceChangeListener {


    LocalBroadcastManager broadcaster = LocalBroadcastManager.getInstance(this);



    public SharedPrefMonService() {

    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
       return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        prefs.unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        prefs.registerOnSharedPreferenceChangeListener(this);
        return Service.START_STICKY;
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if(key.equals("TRIP_LIST")){
            try {
                JSONObject trip_list = new JSONObject(sharedPreferences.getString("TRIP_LIST", "{}"));

                if(trip_list.keys().hasNext()){
                    //start location service
                }else{
                    //stop location service
                }
                //update trip list view   here
                Intent intent = new Intent("SharedPrefMonService");
                intent.putExtra("updated_trip_list", trip_list.toString());
                broadcaster.sendBroadcast(intent);
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }
}

1 个答案:

答案 0 :(得分:1)

并不是说你必须拥有Service中的听众。您没有将侦听器设置为您正在修改的SharedPreferences

Context#getSharedPreferences()使用您提供的名称创建SharedPreferencesPreferenceManager.getDefaultSharedPreferences()会在您的软件包名称中创建SharedPreferences并附加_preferences。它们最终都是XML文件,但是其中一个监听器不会被通知另一个人的更改。

更改您正在修改的SharedPreferences以使用默认值 - PreferenceManager.getDefaultSharedPreferences() - 或者将您的收听者设置为当前正在保存的收件人 - getSharedPreferences("TRACKER", Context.MODE_PRIVATE)

我还要提到OnSharedPreferenceChangeListener只会在特定键值更改时触发。如果您使用与之相同的值保存密钥,则onSharedPreferenceChanged()将无法运行。