発生事象
SharedPreferencesで古い値を取得してしまうことがあった。(毎回ではないところがバグに気付きにくかった・・・)
原因
今回、AlarmManagerを使用してBroadcastReceiver内でSharedPreferencesの値を使用しており、AlarmManagerのサンプルでは以下のようになっていることが多く、それを深く考えずそのまま使用してしまっていたので別プロセスでのアクセスになってしまっていた。
SharedPreferencesはドキュメントにもあるように、マルチプロセスでの動作を保証していない。
Note: This class does not support use across multiple processes.
SharedPreferences
<receiver
android:name=".AlarmReceiver"
android:process=":remote" />
解決
実際、別プロセスで扱う必要はなかったのでprocess指定を外すことで常に最新の値を取得することができるようになった。
別プロセスで扱いたい場合に考えること
- MODE_MULTI_PROCESSはdeprecatedになっているので良くない
- ContentProviderを使う
- SharedPreferencesではなく別のものを使う(SQLiteとかライブラリとか何が良いかは値によって判断)
まとめ
基本的なことですが、サンプルなどを引っ張ってきて実装するときはコードの意味をきちんと理解しないとダメですね。
参考
BroadcastReceiverにprocess =":remote"をつける必要があるかどうかについて
Should I use android: process =“:remote” in my receiver?