我目前正在使用 SharedPreferences 来跟踪要在通过 AlarmManager 启动的 BroadcastReceiver 中执行工作的项目列表。除了特定场景外,一切都很好。当我触发一个新项目来执行工作时,让它完成工作,然后删除该项目(全部通过 SharedPreferences 编辑),它在应用程序运行时运行良好。当列表中没有任何内容并且我打开任务管理器并终止应用程序时,该项目突然出现在 BroadcastReceiver 中(在应用程序关闭后仍在运行)。是什么导致了这种行为?我应该在应用程序退出时杀死所有接收者吗?当 Receiver 仍在运行时,Activity 关闭是否默认返回到不同的 SharedPreferences 对象?
从 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 启动
- 声明中没有特殊设置
- 这在卸载应用程序后可以重复,清除接收器中的所有首选项(以防它使用不同的首选项)