2014-01-21 4 views
0

Я разрабатываю приложение для Android, которое использует push-уведомления для получения уведомлений, даже если приложение закрыто и сохраняет их с помощью sharedpreferences, я создал класс широковещательного приемника и инициализировал объект sharedpreferences, который был определен в другом классе под названием Register in onReceive() следующим образом:Как инициализировать объект SharedPreferences в BroadcastReceiver?

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

уведомления работать, когда приложение уже открыто, но при закрытии приложения, и я пытаюсь отправить уведомление, приложение показать Force Закрыть сообщение, и я увидел NullPointerException в LogCat, я предположим, что проблема возникает из инициализации объекта sharedpreferences, так есть ли другой способ правильно инициализировать этот объект в широковещательном приемнике?

+0

Что такое реестр? –

+0

это еще один класс, расширенный от деятельности –

+0

, зачем это нужно здесь? –

ответ

0

ошибка не из-за 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(); 

также preferences и listPreferences, кажется, то же самое значение, я не знаю, почему так.

PreferenceManager.getDefaultSharedPreferences(context) будет возвращать такой же предпочтительный объект каждый раз.

0

vipul is right. Это связано с тем, что ваше приложение использует класс 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); 
    } 
} 
+0

, поэтому вы предлагаете сделать такой класс и вызвать его метод в моем приемнике для инициализации настроек? –

+0

yep .. ему нужен только контекст приложения, который предоставляется методом onReceive. Таким образом вы можете получить доступ к настройкам в любом месте с контекстом. – cYrixmorten

+0

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

0

я уже добавлен, как использовать общие предпочтения в android.Please проверить мой ответ , Надеюсь, это будет полезно для вас. Пожалуйста, дайте мне знать. Если вам нужно больше разъяснений. Спасибо

Shared Prefernces

+0

К сожалению, Jeba нет, проблема возникает, когда я получаю новое уведомление, которое является текстом, и я пытаюсь сохранить его в объекте общих предпочтений, который не инициализирован, потому что приложение не открыто, а это означает, что объект контекста, который используется в процесс инициализации также является нулевым. –

+0

Привет, 3mR, вы зарегистрировали регистр Broadcast в AndroidManifest.xml? Если нет, зарегистрируйтесь как <приемник андроид: name = "YourBroascastReceiverName"> <фильтр-замысел> Jeba

+0

Да, я зарегистрировал его, приемник работает в обоих случаях (приложение открыто или закрыто) проблема возникает только тогда, когда приложение закрыто, и мне нужно инициализировать общий объект предпочтения –

Смежные вопросы