В момента използвам SharedPreferences, за да следя списък с елементи, върху които да извърша работа в BroadcastReceiver, стартиран чрез AlarmManager. Всичко работи чудесно, с изключение на определен сценарий. Когато задействам нов елемент, върху който да извърша работа, оставям го да свърши работата, след което премахвам този елемент (всички чрез редакции на SharedPreferences), той работи прекрасно, докато приложението работи. Когато няма нищо в списъка и отворя диспечера на задачите и затворя приложението, изведнъж елементът се появява обратно в BroadcastReceiver (който все още работи, след като приложението се затвори). Какво причинява това поведение? Трябва ли просто да убия всички приемници при излизане от приложението? Затварянето на дейността връща ли се по подразбиране към различен обект 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
- Няма специални настройки в декларацията
- Това може да се повтори след деинсталиране на приложение, изчистване на всички предпочитания в приемника (в случай че е използвал различен)