現在、SharedPreferences を使用して、AlarmManager を通じて開始された BroadcastReceiver で作業を実行する項目のリストを追跡しています。特定のシナリオを除いて、すべてがうまく機能します。作業を実行する新しいアイテムをトリガーすると、その作業を実行させてから、そのアイテムを削除します (すべて SharedPreferences 編集を介して)。アプリケーションの実行中に、それは美しく機能します。リストに何もなく、タスク マネージャーを開いてアプリケーションを強制終了すると、突然項目が BroadcastReceiver (アプリケーションの終了後も実行中) に表示されます。この動作の原因は何ですか? アプリケーションの終了時にすべてのレシーバーを強制終了する必要がありますか? レシーバーがまだ実行されている場合、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 から開始されます
- 宣言に特別な設定はありません
- これは、アプリケーションをアンインストールした後に繰り返し可能であり、レシーバーのすべての設定をクリアします (別の設定を使用していた場合)。