Удаленный сервис и PreferenceActivity - PullRequest
2 голосов
/ 24 июня 2011

Мое приложение содержит Сервис для обновления данных в зависимости от значений предпочтений.В моем приложении также есть 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 ]

2 голосов
/ 24 июня 2011

Отделите службу и предпочтения с помощью намерения, отправленного в startService (). Эта функция плохо названа - она ​​не просто запускает службу (она запускает ее при необходимости). startService () также отправит сообщение службе, которая уже запущена.

Таким образом, в вашем предпочтительном слушателе, ВНУТРИ вашей префом активности, вы бы назвали что-то вроде:

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 голос
/ 27 июня 2011

Спасибо за ваш ответ.

Я решил свою проблему другим способом.На самом деле, я забыл упомянуть, что мой сервис удаленный.Поэтому я добавляю метод в AIDL для установки нового значения в нем.Мое соединение со службой находится в одноэлементном шаблоне, поэтому в основном мое PrefActivity использует это соединение и, используя метод AIDL, задает переменную, используемую в моем сервисе.

Вопрос в том, какой способ будет наилучшим здесь?

...