Java 为什么这个值为空? 我正在成功地从我的main活动中创建、保存和检索我的共享首选项,但我无法从我的服务中获取它。。。

Java 为什么这个值为空? 我正在成功地从我的main活动中创建、保存和检索我的共享首选项,但我无法从我的服务中获取它。。。,java,android,arrays,database,string,Java,Android,Arrays,Database,String,由于某些原因,当我尝试从后台服务检索共享首选项时,它是空的 我在onCreate: contactsPrefs = getSharedPreferences("contactsPrefs", MODE_PRIVATE); //Making a shared preferences myEditor = contactsPrefs.edit(); Set<String> set = new HashSet<String>(); set.addAl

由于某些原因,当我尝试从后台服务检索共享首选项时,它是空的

我在onCreate:

contactsPrefs = getSharedPreferences("contactsPrefs", MODE_PRIVATE); //Making a shared preferences
    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();
    preferences = PreferenceManager.getDefaultSharedPreferences(c); //See edit at bottom for more info
在onCreate中保存值:

contactsPrefs = getSharedPreferences("contactsPrefs", MODE_PRIVATE); //Making a shared preferences
    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();
    preferences = PreferenceManager.getDefaultSharedPreferences(c); //See edit at bottom for more info

令我失望的是,我得到了日志
Dagnabit它的null
。为什么它是空的?我可以向您保证,它在我的主要活动中起作用,因为当我从共享首选项访问数据时,我能够显示共享首选项中的所有数据。所以我知道它不应该是空的…但出于某种原因

谢谢

拉希尔

编辑: 实际上,我使用ContentObserver注册了一个卷侦听器,并且我正在从那里接受首选项。以下是服务:

 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);

}

尝试使用应用程序上下文获取共享的pref引用,如下所示:

contactsPrefs = 
          getApplicationContext().getSharedPreferences("contactsPrefs", 
          MODE_PRIVATE); //Making a shared preferences
注: 如果仍然获取null,则从服务的onStart()方法获取共享首选项,而不是在onCreate()中进行

编辑: 我测试了它的工作原理

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);
    }
}
}

我注意到在代码的最后一位,使用了var
preferences
,而不是
contactsPrefs
。这是故意的吗?@flkes是的,我已经更新了我的问题,以显示我偏好的实例。:)@我使用的flkes
preferences=PreferenceManager.getDefaultSharedPreferences(c)在服务中。这就是问题所在吗?不,不确定。我只是想知道!此链接可能会有所帮助,但您是否需要添加
MODE\u PRIVATE
参数?请查看我的问题编辑,它位于侦听器中的服务中。可以吗?代码应该如下@Override public int-onStartCommand(Intent-Intent,int-flags,int-startId){contactsPrefs=getApplicationContext().getSharedReferences(“contactsPrefs”,MODE_-PRIVATE);//生成共享首选项返回super.onStartCommand(intent,flags,startId);}你看到我的编辑了吗?它实际上是在一个内容观察者中,所以我得到
无法解析getApplicationContext()
。看看我问题的底部哦,你正在向内容观察者传递一个上下文引用,你可以使用它来获得共享首选项。