我目前正在使用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