【问题标题】:How to initialize a SharedPreferences Object in BroadcastReceiver?如何在 BroadcastReceiver 中初始化 SharedPreferences 对象?
【发布时间】:2014-01-21 13:56:45
【问题描述】:

我正在开发 Android 应用程序,它使用推送通知来获取通知,即使应用程序已关闭并使用 sharedpreferences 保存它们,我已经创建了一个广播接收器类并初始化了我在另一个名为 Register 的类中定义的 sharedpreferences 对象 onReceive( ) 如下:

@Override
public void onReceive(Context context, Intent intent) {

    // Register.preferences = context.getSharedPreferences(arg0, arg1);
    // Register.listPreferences = context.getSharedPreferences(arg0, arg1);

    Register.notificationList = new ArrayList<NotificationBody>();

    Register.preferences = PreferenceManager
            .getDefaultSharedPreferences(context);
    Register.listPreferences= PreferenceManager
            .getDefaultSharedPreferences(context);

    String action = intent.getAction();

    int getSize = Register.preferences.getInt("listSize", 0);
    Editor edit = Register.listPreferences.edit();

当应用程序已经打开但是当应用程序关闭并且我尝试发送通知时,通知工作,应用程序显示强制关闭消息并且我在 logcat 中看到 NullPointerException,我想问题来自初始化sharedpreferences 对象,那么还有另一种方法可以在广播接收器中正确初始化该对象吗?

【问题讨论】:

  • 这是另一个从活动扩展而来的类
  • 这里为什么需要那个??
  • 我需要它,因为当收到通知时,我会立即将其保存在共享首选项对象中。
  • 您可以在活动中再次获得相同的共享偏好对象,无需从接收者那里引用它

标签: android broadcastreceiver sharedpreferences


【解决方案1】:

vipul 是对的。这是因为您的应用依赖于一个 Activity 类,该类很可能在应用关闭时被销毁。

我只是想举例说明如何使用辅助类来简化共享首选项的读/写:

public class PreferencesData {

    public static void saveString(Context context, String key, String value) {
        SharedPreferences sharedPrefs = PreferenceManager
                .getDefaultSharedPreferences(context);
        sharedPrefs.edit().putString(key, value).commit();
    }

    public static String getString(Context context, String key) {
        SharedPreferences sharedPrefs = PreferenceManager
                .getDefaultSharedPreferences(context);
        return sharedPrefs.getString(key);
    }
}

【讨论】:

  • 所以你建议创建这样的类并在我的接收器中调用它的方法来初始化首选项?
  • yep.. 它只需要应用程序上下文,由 onReceive 方法提供。通过这种方式,您可以在任何地方使用上下文访问首选项。
  • 我添加了辅助类,但即使在我添加它并关闭应用程序并尝试发送通知之后,它也会显示强制关闭和相同的错误空指针异常,它没有工作.
  • 那么您介意将 logcat 与您当前的代码一起发布吗?
【解决方案2】:

错误不是因为context 而是因为Register 活动尝试将您的代码更改为:

@Override
public void onReceive(Context context, Intent intent) {

    // Register.preferences = context.getSharedPreferences(arg0, arg1);
    // Register.listPreferences = context.getSharedPreferences(arg0, arg1);

    ArrayList<NotificationBody> notificationList = new ArrayList<NotificationBody>();

    SharedPreferences preferences = PreferenceManager
            .getDefaultSharedPreferences(context);
    SharedPreferences listPreferences= PreferenceManager
            .getDefaultSharedPreferences(context);

    String action = intent.getAction();

    int getSize = preferences.getInt("listSize", 0);
    Editor edit = listPreferences.edit();

preferenceslistPreferences 似乎也有相同的价值,我不知道为什么两者都有。

PreferenceManager.getDefaultSharedPreferences(context) 每次都会返回相同的首选项对象。

【讨论】:

    【解决方案3】:

    我已经添加了如何在 android 中使用共享首选项。请检查我的答案。希望它对你有帮助。请告诉我。如果您需要更多说明。谢谢

    Shared Prefernces

    【讨论】:

    • 不幸的是,Jeba 不,当我收到一个新的文本通知并尝试将其保存在未初始化的共享首选项对象中时出现问题,因为应用程序未打开,这意味着初始化过程中使用的上下文对象也为空。
    • 嗨 3mR 您在 AndroidManifest.xml 中注册了广播寄存器吗?如果不是,请注册为
    • 是的,我注册了它,接收器在两种情况下都有效(应用程序打开或关闭),问题只是应用程序关闭时我需要初始化共享首选项对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多