2016-11-26 31 views
1

SharedPrefencesChangeListenerがこのコードで機能していません。欠落しているものがあれば教えてください。SharedPreferencesChangeListenerが機能していません

私はサービスでそれを宣言しているので、起こっているのだろうかと思っています。

コード別のアクティビティからSharedPreferencesを変更するには:

getSharedPreferences("TRACKER", Context.MODE_PRIVATE).edit().putString("TRIP_LIST", String.valueOf(trip_list)).apply(); 

///

package com.tracker; 

import android.app.Service; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.IBinder; 
import android.preference.PreferenceManager; 
import android.support.v4.content.LocalBroadcastManager; 

import org.json.JSONException; 
import org.json.JSONObject; 

public class SharedPrefMonService extends Service implements SharedPreferences.OnSharedPreferenceChangeListener { 


    LocalBroadcastManager broadcaster = LocalBroadcastManager.getInstance(this); 



    public SharedPrefMonService() { 

    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
     prefs.unregisterOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
     prefs.registerOnSharedPreferenceChangeListener(this); 
     return Service.START_STICKY; 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     if(key.equals("TRIP_LIST")){ 
      try { 
       JSONObject trip_list = new JSONObject(sharedPreferences.getString("TRIP_LIST", "{}")); 

       if(trip_list.keys().hasNext()){ 
        //start location service 
       }else{ 
        //stop location service 
       } 
       //update trip list view here 
       Intent intent = new Intent("SharedPrefMonService"); 
       intent.putExtra("updated_trip_list", trip_list.toString()); 
       broadcaster.sendBroadcast(intent); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 
} 
+0

apply()の代わりにcommit()を使用し、結果をチェックしてデータを保存しているかどうかを確認します。 (commit()は保存時にtrueを返し、falseにはfalseを返します) –

+0

まだ動作しません –

+0

何が結果ですか?正しいか間違っているか? –

答えて

1

それは必ずしも、Serviceでリスナーを持っていることはありません。あなたは変更しているのと同じSharedPreferencesにリスナーを設定していません。

Context#getSharedPreferences()は、指定した名前のSharedPreferencesを作成します。 PreferenceManager.getDefaultSharedPreferences()は、_preferencesというパッケージ名でSharedPreferencesを作成します。両方とも最終的にはXMLファイルですが、リスナーには別のファイルの変更が通知されません。

デフォルトの - PreferenceManager.getDefaultSharedPreferences()を使用するように変更するSharedPreferencesを変更するか、現在保存しているリスナーをgetSharedPreferences("TRACKER", Context.MODE_PRIVATE)に設定します。

OnSharedPreferenceChangeListenerは、特定のキーの値が変更された場合にのみ発生します。です。既に持っているのと同じ値を持つキーを保存すると、onSharedPreferenceChanged()は実行されません。

+1

解決策と情報をありがとう。 –

関連する問題