应用程序终止时删除 SharedPreferences
SharedPreferences deleted when the app is killed
我有一个服务可以接收通知(使用 Google 云消息)并通知用户。在该服务中,我还使用 SharedPreferences 存储了 Cloud Messaging 发送的消息。我将这些消息收集在一个 HashSet 中,并且 HashSet 和它的任何元素都不应该被删除。这很重要,因为我的一项活动必须显示整个消息列表。
这工作正常,除非用户碰巧使用 "Recent Apps" 按钮终止应用程序。当他这样做然后重新启动应用程序时,activity 未检索到某些消息,所以我猜其中一些消息已被以某种方式删除。
我没有正确使用 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());
感谢 Ramesh 的评论,我解决了这个问题。在 editor.putStringSet("SETMESSAGES", setMessages);
之前添加 editor.clear();
修复了它。但是我不知道它以前不起作用的原因。
只需在设置 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();
更新 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()
我有一个服务可以接收通知(使用 Google 云消息)并通知用户。在该服务中,我还使用 SharedPreferences 存储了 Cloud Messaging 发送的消息。我将这些消息收集在一个 HashSet 中,并且 HashSet 和它的任何元素都不应该被删除。这很重要,因为我的一项活动必须显示整个消息列表。
这工作正常,除非用户碰巧使用 "Recent Apps" 按钮终止应用程序。当他这样做然后重新启动应用程序时,activity 未检索到某些消息,所以我猜其中一些消息已被以某种方式删除。
我没有正确使用 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());
感谢 Ramesh 的评论,我解决了这个问题。在 editor.putStringSet("SETMESSAGES", setMessages);
之前添加 editor.clear();
修复了它。但是我不知道它以前不起作用的原因。
只需在设置 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();
更新 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()