应用程序被杀死时删除SharedPreferences

时间:2015-02-14 11:22:34

标签: android sharedpreferences google-cloud-messaging

我有一个可以接收通知的服务(使用Google Cloud Messaging)并通知用户。在该服务中,我还使用SharedPreferences存储由Cloud Messaging发送的消息。我在HashSet中收集这些消息,并且HashSet或其任何元素都不应该被删除。这很重要,因为我的一个活动必须显示整个消息列表。

除非用户碰巧使用“Recent Apps”按钮来终止应用程序,否则此工作正常。当他这样做然后重新启动应用程序时,活动不会检索到某些消息,因此我猜测其中一些消息已被删除。

我没有正确使用SharedPreferences吗?我应该做些什么来避免这种情况?这是我的服务代码:(我的onHandleIntent方法的相关部分)

    mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, Notifications.class), 0);
String message=extras.getString("message");

sharedpreferences=this.getSharedPreferences(Constantes.PREFERENCES,Context.MODE_PRIVATE);
Set<String> setMessages= sharedpreferences.getStringSet("SETMESSAGES", new HashSet<String>());
setMessages.add(message);
Editor editor = sharedpreferences.edit();
editor.putStringSet("SETMESSAGES", setMessages);
editor.commit();

//The notification:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.icon)
    .setContentTitle("New Notification")
    .setStyle(new NotificationCompat.BigTextStyle().bigText("You got some new message!"))
    .setContentText("You got some new message!")
    .setAutoCancel(true)
    .setDefaults(Notification.DEFAULT_SOUND);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

3 个答案:

答案 0 :(得分:3)

在设置putStringSet之前添加editor.clear()。像:

 sharedpreferences=this.getSharedPreferences
                (Constantes.PREFERENCES,Context.MODE_PRIVATE);
 Set<String> setMessages= sharedpreferences.getStringSet
                ("SETMESSAGES", new HashSet<String>());
 setMessages.add(message);
 Editor editor = sharedpreferences.edit();
 editor.clear();
 editor.putStringSet("SETMESSAGES", setMessages);
 editor.commit();

答案 1 :(得分:1)

更新StringSet时,创建Set的新副本并更新或删除现有的StringSet,然后添加共享首选项

 String key = "SETMESSAGES";
 sharedpreferences=this.getSharedPreferences
                (Constantes.PREFERENCES,Context.MODE_PRIVATE);
 Set<String> setMessages= sharedpreferences.getStringSet
                (key, new HashSet<String>());
 setMessages.add(message);
 Editor editor = sharedpreferences.edit();
 editor.remove(key);
 editor.putStringSet(key, setMessages);
 editor.commit(); 

P.S。最好调用editor.apply()而不是editor.commit()

答案 2 :(得分:0)

由于Ramesh的评论,我解决了这个问题。在editor.clear();修复之前添加editor.putStringSet("SETMESSAGES", setMessages);。但是我不知道为什么之前没有用的原因。