В настоящее время я использую SharedPreferences, чтобы отслеживать список элементов для выполнения работы в BroadcastReceiver, запускаемом через AlarmManager. Все работает отлично, за исключением конкретного сценария. Когда я запускаю новый элемент для выполнения работы, пусть он выполняет эту работу, а затем удаляет этот элемент (все с помощью редактирования SharedPreferences), он прекрасно работает во время работы приложения. Когда в списке нет ничего, и я открываю Диспетчер задач и убиваю приложение, внезапно появляется элемент в BroadcastReceiver (который все еще работает после закрытия приложения). Что вызывает такое поведение? Должен ли я просто убить всех получателей при выходе из приложения? Возвращает ли действие закрытие по умолчанию другого объекта SharedPreferences, когда приемник все еще работает?SharedPreferences - Activity and 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);
}
}
}
}
Когда я запускаю код для добавления/удаления объектов из исходного списка, как и ожидалось, I см
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