这是我在ContactActivity类中声明的内容
final SharedPreferences exceptionPrefs = PreferenceManager.getDefaultSharedPreferences(this);
exceptionPrefs.edit().putString("Exceptions", TextUtils.join(",", exceptions)).apply();
在另一个类(不是活动。它扩展BroadcastReceiver
),尝试从SharedPreference
我onReceive()
中使用此内容获取存储的值 -
SharedPreferences exceptionPositionPrefs = PreferenceManager.getDefaultSharedPreferences(new ContactActivity().getContext());
该行抛出NullPointerException。
另外,我必须添加onReceive包含另一个SharedPreferences对象,该对象从我的MainActivity
接收值。
这是LogCat。
10-19 15:49:03.628: E/AndroidRuntime(24226): FATAL EXCEPTION: main
10-19 15:49:03.628: E/AndroidRuntime(24226): java.lang.RuntimeException: Unable to start receiver com.scimet.admin.driveon.RejectCall: java.lang.NullPointerException
10-19 15:49:03.628: E/AndroidRuntime(24226): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2146)
10-19 15:49:03.628: E/AndroidRuntime(24226): at android.app.ActivityThread.access$1500(ActivityThread.java:127)
10-19 15:49:03.628: E/AndroidRuntime(24226): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
10-19 15:49:03.628: E/AndroidRuntime(24226): at android.os.Handler.dispatchMessage(Handler.java:99)
10-19 15:49:03.628: E/AndroidRuntime(24226): at android.os.Looper.loop(Looper.java:137)
10-19 15:49:03.628: E/AndroidRuntime(24226): at android.app.ActivityThread.main(ActivityThread.java:4441)
10-19 15:49:03.628: E/AndroidRuntime(24226): at java.lang.reflect.Method.invokeNative(Native Method)
10-19 15:49:03.628: E/AndroidRuntime(24226): at java.lang.reflect.Method.invoke(Method.java:511)
10-19 15:49:03.628: E/AndroidRuntime(24226): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-19 15:49:03.628: E/AndroidRuntime(24226): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-19 15:49:03.628: E/AndroidRuntime(24226): at dalvik.system.NativeStart.main(Native Method)
10-19 15:49:03.628: E/AndroidRuntime(24226): Caused by: java.lang.NullPointerException
10-19 15:49:03.628: E/AndroidRuntime(24226): at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:371)
10-19 15:49:03.628: E/AndroidRuntime(24226): at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:366)
10-19 15:49:03.628: E/AndroidRuntime(24226): at com.scimet.admin.driveon.RejectCall.onReceive(RejectCall.java:36)
10-19 15:49:03.628: E/AndroidRuntime(24226): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2139)
10-19 15:49:03.628: E/AndroidRuntime(24226): ... 10 more
答案 0 :(得分:0)
您永远不应该实例化一个活动类并从那里获取上下文。实际上你不应该实例化一个活动期;您应该使用startActivity来处理活动生命周期。
为什么你这样做呢,BroadcastReceiver确实得到了提供给onReceive方法的上下文,你不能只使用那个上下文来检索你的SharedPreference吗?
答案 1 :(得分:0)
您使用的偏好在所有活动之间共享。
PreferenceManager.getDefaultSharedPreferences(ctx);
如果ctx
是MainActivity或ContactActivity,上述内容将返回相同的偏好。
所以基本上你可以用BroadcastReceiver从你可用的上下文中调用它。
如果您想获得与活动相关的偏好,那么您应该致电Context.getPreferences()
。