gpt4 book ai didi

android - SharedPreferences - Activity 和 BroadcastReceiver

转载 作者:行者123 更新时间:2023-11-29 16:08:04 25 4
gpt4 key购买 nike

我目前正在使用 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 启动
  • 声明中没有特殊设置
  • 这在卸载应用程序后可重复,清除接收器中的所有首选项(以防它使用不同的首选项)

最佳答案

editor.apply(); 更改为 editor.commit()。当您终止应用程序时,更改可能不会写入磁盘。来自 http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply() 的官方文档

Unlike commit(), which writes its preferences out to persistent storage synchronously, apply() commits its changes to the in-memory SharedPreferences immediately but starts an asynchronous commit to disk and you won't be notified of any failures. If another editor on this SharedPreferences does a regular commit() while a apply() is still outstanding, the commit() will block until all async commits are completed as well as the commit itself.

关于android - SharedPreferences - Activity 和 BroadcastReceiver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16310921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com