2
1

More than 1 year has passed since last update.

SharedPreferencesはprocess間共有できない

Last updated at Posted at 2020-04-25

発生事象

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?

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1