2011-06-24 6 views
2

私のアプリケーションには、設定値に応じてデータを更新するサービスが含まれています。 私のアプリケーションでは、これらの値を変更するためのPreferenceActivityもあります。リモートサービスと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 -----------------------"); 

    } 
} 

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メソッドを使用して、私のサービスで使用される変数を設定します。

質問は、ここではどの方法がベストプラクティスですか?

関連する問題