我的应用程序包含一个服务,用于根据首选项值刷新数据。 我的应用程序中还有一个PreferenceActivity来改变这些值。
我的服务实现OnSharedPreferenceChangeListener,获取首选项并注册监听器。我可以获得首选项值,但如果我更改数据活动中的首选项,则不会调用onSharedPreferencesChanged(因此数据不会更新)。
有没有办法在不绑定PreferenceActivity和服务的情况下修复此问题?
由于
public class EventsService extends Service implements OnSharedPreferenceChangeListener {
...
private SharedPreferences preferences;
...
@Override
public void onCreate() {
super.onCreate();
...
preferences = PreferenceManager.getDefaultSharedPreferences(this);
preferences.registerOnSharedPreferenceChangeListener(this);
...
}
//On the same way i unregistered the listener onDestroy()
private TimerTask updateTask = new TimerTask() {
@Override
public void run() {
....
Log.v(TAG,"PREF : "+Integer.parseInt(preferences.getString("special_reminder_minutes","10")));
....
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.d(TAG,"PREF CHANGED O -----------------------");
}
}
注意:目前,首选项只包含一个字符串数组。
答案 0 :(得分:2)
使用发送到“startService()”的意图来解耦服务和首选项。该功能命名不佳 - 它不仅仅是启动服务(它将在必要时启动它)。 startService()还会向已经运行的服务发送消息。
所以在你的偏好听众中,在你的pref活动中,你会打电话给:
Intent messageIntent = new Intent(context, MyService.class);
messageIntent.setAction(MyService.GAME_ALERT);
messageIntent.putExtra(MyService.GAME_ID, gameId);
context.startService(messageIntent);
要在服务中接收此消息,请覆盖onStartService(),如下所示(请注意,粘性是可选的 - 取决于您的服务的用例):
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent == null)
return START_STICKY;
try {
String action = intent.getAction();
if (GAME_ALERT.equals(action)) {
// handle it
String gameId = intent.getStringExtra(GAME_ID);
if (gameId != null) {
//
}
}
} catch (Throwable e) {
Log.e("me", "problem: ", e);
}
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
答案 1 :(得分:1)
感谢您的回答。
我用另一种方式解决了我的问题。 事实上,我忘了提到我的服务是远程服务。 所以我在AIDL中添加一个方法来设置它的新值。我的服务连接在单例模式中,所以基本上我的PrefActivity使用此连接并使用AIDL方法设置我的服务中使用的变量。
问题是,哪种方式是最好的做法?