SharedPreferencesChangeListener 不工作

SharedPreferencesChangeListener not working

SharedPrefencesChangeListener 在此代码中不起作用。如有遗漏请指出

我想知道它是否正在发生,因为我已经在服务中声明了它。

更改 SharedPreferences 的代码 activity:

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

        }
    }
}

不一定是 Service 中有监听器。您没有在您正在修改的 SharedPreferences 上设置侦听器。

Context#getSharedPreferences() 使用您指定的名称创建一个 SharedPreferencesPreferenceManager.getDefaultSharedPreferences() 从您的包名称创建一个 SharedPreferences 并附加 _preferences。它们最终都是 XML 文件,但其中一个的侦听器不会收到另一个文件的更改通知。

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

我还要提到 OnSharedPreferenceChangeListener 只会在特定键的值 更改 时触发。如果您保存的键与它已有的值相同,onSharedPreferenceChanged() 不会 运行。