web-dev-qa-db-ja.com

同じアプリケーションの2つのプロセス間で共有される設定

UIと実行中の個別のプロセスの両方を含むAndroidアプリを作成しています。メインプロセスと、別のプロセスで実行されるアプリケーションで定義されたサービスとの間で簡単な情報を共有したいと思います。この目的のためにプロセス間通信にAIDLを使用するのは面倒です。

問題は、この2つのプロセス間の通信にアプリケーションの共有設定を使用しても安全ですか?これは、同じ共有設定の読み取りと書き込みの両方です。

それが実際に機能するかどうか疑問に思います。 Android開発者は共有設定に関するリファレンス(http://developer.Android.com/reference/Android/content/SharedPreferences.html)で次のように述べています:注:現在、このクラスは複数のプロセスでの使用はサポートされていません。これは後で追加されます。しかし、これが何を意味するのか正確にはわかりません。

ご協力いただきありがとうございます

24
Javierfdr

Android <2.3で動作します。一方のプロセスは変更を書き込み、もう一方のプロセスは変更を読み取ることができます。共有設定ファイル(実際にはファイルに保存されています)を読み書きするコードは、そこにあるかどうかを確認します。読み取り/書き込みの前にファイルに変更が加えられ、それに応じてキャッシュされたバージョンが更新されます。

Android> 2.3では機能しますが、getSharedPreferences()を呼び出すときは、特にMODE_MULTI_PROCESSを設定する必要があります。

Android 2.3では壊れていて、機能しません:

MODE_MULTI_PROCESSは---(APIレベル23(Android M) で非推奨になっていることに注意してください。

34
David Wasser

あなたはチェックアウトすることができます https://github.com/hamsterksu/MultiprocessPreferences ContentProviderを介してSharedPreferencesデータにアクセスするためのSharedPreferencesのようなAPIを提供するライブラリ。また、GoogleがMODE_MULTI_PROCESSをAndroid 6から削除した後は、良い代替手段のように見えます。

9
Sam Lu

番号;これを行うのは安全ではありません。あなたが引用したメモは正しいです。複数のプロセスでSharedPreferencesを使用しようとすると、発生する可能性のある既知の問題があります。 ( https://code.google.com/p/Android/issues/detail?id=66625 を参照してください。)

さらに証拠が必要な場合は、SharedPreferencesImplのソースコード、特に設定を保存する部分を確認してください。

両方のプロセスがSharedPreferencesファイルに同時にアクセスできないようにすることで、この問題を回避しました。 (ここに クロスプロセスロックを提供する1つの方法 、そしてここに 私が書いた完全な実装例 。)

警告:残念ながら、MODE_MULTI_PROCESSはAndroid Mで非推奨になったため、今後のリリースで機能しなくなる可能性があります。ContentProviderの使用などの代替手法がより適切なオプションになる可能性があります。

0
Sam