我目前正在使用SharedPreferences跟踪在通过AlarmManager启动的BroadcastReceiver中执行工作的项目列表。除了特定的场景,一切都很好。当我触发一个新项目执行工作时,让它执行工作,然后删除该项目(全部通过SharedPreferences编辑),它在应用程序运行时运行良好。当列表中没有任何内容时,我打开任务管理器并终止应用程序,突然间,该项目出现在BroadcastReceiver(在应用程序关闭后仍在运行)中。什么导致这种行为?我应该在应用程序退出时杀死所有接收器吗?当Receiver仍在运行时,活动关闭默认返回到不同的SharedPreferences对象吗?SharedPreferences - 活动和BroadcastReceiver
代码以从SharedPreferences添加/删除项目对象
final SharedPreferences prefs = context.getSharedPreferences(Config.PREFS_NAME,
Context.MODE_PRIVATE);
final Editor editor = prefs.edit();
mUpdates = prefs.getStringSet(Config.PREFS_KEY_ACTIVE_TASKS, new HashSet<String>());
if (!mUpdates.contains(key)) {
mUpdates.add(key);
} else {
mUpdates.remove(key);
}
editor.putStringSet(Config.PREFS_KEY_ACTIVE_TASKS, mUpdates);
editor.apply();
的广播接收机代码
public void onReceive(Context context, Intent intent) {
SharedPreferences prefs = context.getSharedPreferences(Config.PREFS_NAME, Context.MODE_PRIVATE);
if(prefs.contains(Config.PREFS_KEY_ACTIVE_TASKS)) {
Set<String> updates = prefs.getStringSet(Config.PREFS_KEY_ACTIVE_TASKS, null);
if(updates != null) {
Log.d("RECEIVER","Size="+updates.size());
for(String key : updates) {
EntityChangeManager.notifyListeners(key);
}
}
}
}
当我运行代码以添加/从最初的列表中删除的对象,如所预期我看到
04-30 20:04:44.165: D/RECEIVER(27079): Size=1
04-30 20:04:44.165: D/RECEIVER(27079): Size=0
当我杀了应用程序,我看到
个04-30 20:04:43.244: D/ActivityThread(27079): setTargetHeapUtilization:0.25
04-30 20:04:43.244: D/ActivityThread(27079): setTargetHeapIdealFree:8388608
04-30 20:04:43.254: D/ActivityThread(27079): setTargetHeapConcurrentStart:2097152
04-30 20:04:43.264: D/RECEIVER(27079): Size=1
问题的兴趣:
- 接收器运行的每一秒
- 接收器是由一个AlarmManager
- 没有特殊设置在声明开始
- 这是卸载应用程序后,可重复,清除接收器中的所有首选项(如果使用不同的首选项)
看来这与使用StringSet直接相关,尽管我没有确定原因。提示手动构建和解析字符串,而不是使用stringset。 – methodin 2013-05-01 01:28:48