I'm trying to restart a service with new settings when preferences change. The code I'm using is roughly similar to that from this question:
SettingsActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Initiate listener
findPreference("service_switch").setOnPreferenceChangeListener(sRestartMyServiceOnChangeListener);
...
}
private Preference.OnPreferenceChangeListener sRestartMyServiceOnChangeListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object obj) {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(SettingsActivity.this);
// Stop service
stopService(new Intent(SettingsActivity.this, MyService.class));
// Restart service
if (sharedPref.getBoolean("service_switch", false)) {
startService(new Intent(SettingsActivity.this, MyService.class));
}
return true;
}
};
This doesn't work on my phone, throwing the error:
findPreference(java.lang.CharSequence) is deprecated
This answer says that Android has moved to fragment-based activities. SettingsActivity
is fragment-based... so I tried starting the listener in the fragment's onCreate()
:
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
// Initiate listener
findPreference("service_switch").setOnPreferenceChangeListener(sRestartMyServiceOnChangeListener);
...
}
}
Now I don't see the deprecation error, but I get a new one:
Non-static field 'sRestartMyServiceOnChangeListener' cannot be referenced from a static context.
I can't make sRestartMyServiceOnChangeListener
static, because stopService()
and startService()
are both non-static. I also can't make the fragment static:
This fragment inner class should be static
So how can I restart MyService from the preferences fragment when a setting changes?