远程服务& PreferenceActivity

时间:2011-06-24 08:49:42

标签: android service sharedpreferences

我的应用程序包含一个服务,用于根据首选项值刷新数据。 我的应用程序中还有一个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 -----------------------");

   }
 }

注意:目前,首选项只包含一个字符串数组。

2 个答案:

答案 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方法设置我的服务中使用的变量。

问题是,哪种方式是最好的做法?