1

I have a daily alarm and a settings page that allow users to change the timing that the daily alarm fires. I have a OnSharedPreferenceChangeListener in my SettingsFragment that extends PreferenceFragmentCompat and it is working here. However, when I do the same thing in my MainActivity, it does not seem to be working.

This is my code in Main Activity: '''

public class MainActivity extends AppCompatActivity {

//some other variables
private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//some other code

preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                if (key.equals("daily alarm time")){
                    int alarmTime = sharedPreferences.getInt("daily alarm time", 36000000);
                    setdailyalarm(alarmTime, true, false);
                    System.out.println("onsharedpreferencechange activited");
                }
                if (key.equals("daily alarm toggle")){
                    Boolean dailyAlarmToggle = sharedPreferences.getBoolean(key, true);
                    System.out.println("111111111111111111111111");
                    if (dailyAlarmToggle){
                        int alarmTime = sharedPreferences.getInt(key, 36000000);
                        setdailyalarm(alarmTime, true, false);
                    }
                    else{
                        int alarmTime = sharedPreferences.getInt(key, 36000000);
                        setdailyalarm(alarmTime, true, true);
                    }
                }
            }
        };

}

'''

This is my onpause and onresume: '''

@Override
    protected void onPause() {
        super.onPause();
        PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);

    }

    @Override
    protected void onResume() {
        super.onResume();
        PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(preferenceChangeListener);

    }

'''

When I start my app and check my System.out, '''System.out.println("onsharedpreferencechange activited");''' does not seem to be firing which means my OnSharedPreferenceChangeListener is not working. I have seem the other discussions SharedPreferences.onSharedPreferenceChangeListener not being called consistently but it does not seem to be the solution to my problem.

David Yao
  • 107
  • 8
  • have you try only registering the listener in `onCreate()` and commenting the unregister part? – ישו אוהב אותך Jul 12 '19 at 10:15
  • OMG it works. I am such a fool. It is unregistered every time I change my sharedpreferences since I will be in the Settings activity. Thank you so much xDD Do you know if I dun unregister it, does it affect performance in any way? – David Yao Jul 12 '19 at 10:37
  • Great that it works! If you didn't unregister the listener, it will keep listening to the changes. I usually unregister it in `onDestroy` on whenever I call `finish()`. Let me create an answer to close the question then. – ישו אוהב אותך Jul 12 '19 at 10:48

1 Answers1

0

When I start my app and check my System.out, '''System.out.println("onsharedpreferencechange activited");''' does not seem to be firing which means my OnSharedPreferenceChangeListener is not working.

It's because you're always unregistering the listener in your onPause(). So, whenever you leave the activity, the listener is removed and you can't listen for the SharedPreferences changes.

You could register the listener inside your onCreate() method.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // setup the listener
    preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    ...

    // then register it
    PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(preferenceChangeListener);

}

Then unregister the listener when you close the activity by overriding the onDestroy() method:

@Override
public void onDestroy() {
  PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);

  super.onDestroy();
}

Or unregister the listener whenever you call finish() method. Either call the unregister part before finish() or overriding the finish() method.

ישו אוהב אותך
  • 28,609
  • 11
  • 78
  • 96