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()
使用您指定的名称创建一个 SharedPreferences
。 PreferenceManager.getDefaultSharedPreferences()
从您的包名称创建一个 SharedPreferences
并附加 _preferences
。它们最终都是 XML 文件,但其中一个的侦听器不会收到另一个文件的更改通知。
要么将您正在修改的 SharedPreferences
更改为使用默认值 - PreferenceManager.getDefaultSharedPreferences()
- 或者将您的监听器设置为您当前保存到的监听器 - getSharedPreferences("TRACKER", Context.MODE_PRIVATE)
。
我还要提到 OnSharedPreferenceChangeListener
只会在特定键的值 更改 时触发。如果您保存的键与它已有的值相同,onSharedPreferenceChanged()
不会 运行。
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()
使用您指定的名称创建一个 SharedPreferences
。 PreferenceManager.getDefaultSharedPreferences()
从您的包名称创建一个 SharedPreferences
并附加 _preferences
。它们最终都是 XML 文件,但其中一个的侦听器不会收到另一个文件的更改通知。
要么将您正在修改的 SharedPreferences
更改为使用默认值 - PreferenceManager.getDefaultSharedPreferences()
- 或者将您的监听器设置为您当前保存到的监听器 - getSharedPreferences("TRACKER", Context.MODE_PRIVATE)
。
我还要提到 OnSharedPreferenceChangeListener
只会在特定键的值 更改 时触发。如果您保存的键与它已有的值相同,onSharedPreferenceChanged()
不会 运行。