1. ホーム
  2. android

onSharedPreferenceChangedは、別のアクティビティで変更が発生した場合、発生しないのですか?

2023-11-14 21:40:01

質問

私が実装した onSharedPreferenceChanged をメインアクティビティに実装しました。

メインアクティビティでプリファレンスを変更すると、私のイベントが発生します。

環境設定画面で環境設定を変更した場合( PreferenceActivity で変更した場合、私のイベントは発生しません (別のアクティビティであり、sharedPreferences への参照も別であるため?)。

どなたか、この状況を克服するためにどのようにしたらよいか、推奨事項をお持ちですか?

ありがとうございます。

EDIT1: イベントハンドラをプリファレンスアクティビティに追加してみましたが、一度も起動しませんでした。次のメソッドは、私のプリファレンス・アクティビティの onCreate の間に呼び出されます。値を変更しても、メッセージは表示されません ( msg() のラッパーです。 Log.d ).

private void registerChangeListener () {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

    sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener () {
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            msg (" ***** Shared Preference Update ***** ");
            Intent i = new Intent();
            i.putExtra("KEY", key);
            i.setAction("com.gtosoft.dash.settingschanged");

            sendBroadcast(i);

            // TODO: fire off the event
        }
    });
}

どのように解決するのですか?

この OnSharedPreferenceChangeListener は、匿名クラスを使用した場合、ガベージコレクションされます。

この問題を解決するには、次のコードを PreferenceActivity で変更リスナーの登録と解除を行います。

public class MyActivity extends PreferenceActivity implements
    OnSharedPreferenceChangeListener {

@Override
protected void onResume() {
    super.onResume();
    // Set up a listener whenever a key changes
    getPreferenceScreen().getSharedPreferences()
            .registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();
    // Unregister the listener whenever a key changes
    getPreferenceScreen().getSharedPreferences()
            .unregisterOnSharedPreferenceChangeListener(this);
}

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) 
{
  // do stuff
}

さらに、リスナーは実際の値が変更された場合にのみ呼び出されることに注意してください。同じ値を再び設定しても、リスナーは呼び出されません。

参照 SharedPreferences.onSharedPreferenceChangeListener が一貫して呼び出されていない。