为什么这个值为null?
我成功地从mainActivity
制作,保存和检索我的共享首选项,但我无法从我的服务中获取它…
出于某种原因,当我尝试从后台服务中检索时,我的共享首选项为null …
我在onCreate中初始化我的首选项:
contactsPrefs = getSharedPreferences("contactsPrefs", MODE_PRIVATE); //Making a shared preferences
在onCreate中保存值:
myEditor = contactsPrefs.edit(); Set set = new HashSet(); 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
编辑:
我实际上使用内容观察器注册了一个卷监听器,我从那里访问首选项。 这是在服务中:
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); } } }