Почему это значение null?

Я успешно выполняю, сохраняю и извлекаю свои общие настройки из своего mainActivity, но я не могу получить его из моей службы...

По какой-то причине мои общие предпочтения имеют значение null, когда я пытаюсь получить его из фоновой службы...

Я инициализирую свои настройки в onCreate:

contactsPrefs = getSharedPreferences("contactsPrefs", MODE_PRIVATE); //Making a shared preferences

Сохранить значения в onCreate:

    myEditor = contactsPrefs.edit();

    Set<String> set = new HashSet<String>();
    set.addAll(contactArrayList);

    myEditor.clear(); //Clearing current values in shared pref
    myEditor.putStringSet("contactSetKey", set); //Adding contacts
    myEditor.commit();

Все это идет хорошо, но когда я пытаюсь получить доступ к моим настройкам из своей службы, я получаю null:

    preferences = PreferenceManager.getDefaultSharedPreferences(c); //See edit at bottom for more info

if(preferences.getStringSet("contactSetKey", null) != null) {
        contactArrayList.addAll(preferences.getStringSet("contactSetKey", null));

        for (String number : contactArrayList) {

            number.substring(number.indexOf("-") + 1); //Remove all characters before the hyphen from my string

            Log.v(TAG, number);

        }
    }else{
        Log.v(TAG, "Dagnabit it its null");
    }

И к моему разочарованию, я получаю журнал Dagnabit it its null. почему это пусто? Я могу заверить вас, что он работает из моего основного вида деятельности, потому что я могу отображать все свои данные из своих общих настроек, когда я обращаюсь к нему из своих общих предпочтений. Поэтому я знаю, что он не должен быть нулевым... Но по какой-то причине

Спасибо,

Ruchir

EDIT:

Я фактически регистрирую слушателя томов, используя контент-наблюдателя, и я пользуюсь предпочтениями оттуда. Здесь находится сервис:

 mSettingsContentObserver = new volumeCheck(this, new Handler());
        getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver);

Вот контент-наблюдатель:

   public class volumeCheck extends ContentObserver {

 public volumeCheck(Context c, Handler handler) {
        super(handler); //Creates a new handler
        context = c; //variable context, defined earlier, is set equal to c, context of service.

        preferences = PreferenceManager.getDefaultSharedPreferences(c);

}

Ответ 1

Попробуйте получить общую ссылку pref с использованием контекста приложения, как показано ниже:

contactsPrefs = 
          getApplicationContext().getSharedPreferences("contactsPrefs", 
          MODE_PRIVATE); //Making a shared preferences

Примечание: Если вы все еще получаете нуль, то получите общее предпочтение от метода onStart() службы вместо того, чтобы делать это внутри onCreate().

EDIT: Я тестировал и работаю

public class MainActivity extends AppCompatActivity {

private SharedPreferences preferences;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString("Status","Success");
    editor.apply();

    getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true,
            new VolumeCheck(this, new Handler()));
}
}



import android.content.Context;
import android.content.SharedPreferences;
import android.database.ContentObserver;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;


public class VolumeCheck extends ContentObserver {
private final SharedPreferences preferences;

private Context context;

public VolumeCheck(Context c, Handler handler) {
    super(handler); //Creates a new handler
    context = c; //variable context, defined earlier, is set equal to c, context of service.

    preferences = PreferenceManager.getDefaultSharedPreferences(c.getApplicationContext());
    String status = preferences.getString("Status", "");
    if(!status.equalsIgnoreCase(""))
    {
        // got the value read from shared preference
        Log.i("Reading value", status);
    }
}
}