25

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

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

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

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

4

3 に答える 3

37

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

Android > 2.3 では動作しますがMODE_MULTI_PROCESS、呼び出すときに具体的に設定する必要がありますgetSharedPreferences()

Android 2.3では壊れていて動作しません:-(

はAPI レベル 23 (Android M)MODE_MULTI_PROCESSで廃止されることに注意してください。

于 2012-08-27T14:53:13.083 に答える
9
于 2015-08-27T14:20:14.890 に答える
0

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

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

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

警告: 残念ながら、MODE_MULTI_PROCESSAndroid M では廃止されたため、今後のリリースでは動作しなくなる可能性があります。を使用するなどの別の手法を使用ContentProviderする方がよい場合があります。

于 2015-07-09T13:04:16.120 に答える