2011-06-24 3 views
2

Мое приложение содержит Сервис для обновления данных в зависимости от значений предпочтений. У меня также есть в приложении приложение PreferenceActivity для изменения этих значений.Удаленное обслуживание и преференцияActivity

Мой сервис реализует 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 -----------------------"); 

    } 
} 

NB: На данный момент, предпочтения содержит только массив строк.

ответ

2

Отмените сервис и настройки с помощью намерения, отправленного на «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

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

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

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

Смежные вопросы