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();
}
}
}
}
答案 0 :(得分:1)
并不是说你必须拥有Service
中的听众。您没有将侦听器设置为您正在修改的SharedPreferences
。
Context#getSharedPreferences()
使用您提供的名称创建SharedPreferences
。 PreferenceManager.getDefaultSharedPreferences()
会在您的软件包名称中创建SharedPreferences
并附加_preferences
。它们最终都是XML文件,但是其中一个监听器不会被通知另一个人的更改。
更改您正在修改的SharedPreferences
以使用默认值 - PreferenceManager.getDefaultSharedPreferences()
- 或者将您的收听者设置为当前正在保存的收件人 - getSharedPreferences("TRACKER", Context.MODE_PRIVATE)
。
我还要提到OnSharedPreferenceChangeListener
只会在特定键值更改时触发。如果您使用与之相同的值保存密钥,则onSharedPreferenceChanged()
将无法运行。