1

私はPreferenceActivityとアプリと(原因アンドロイドに独自のリモートプロセスで実行されている:プロセス=「リモート」フラグ)サービスを構築しています両方ともプログラムでSharedPreferencesにアクセスする必要があります。現時点では私は両方サービスPreferenceActivityクラスで定義されたgetSharedPreferences方法使用する次のコードでSharedPreferenceオブジェクト取得しています:同じアプリ内でPreferenceActivityとサービスの両方でSharedPreferencesの管理

SharedPreferences sharedPrefs = getSharedPreferences("com.mypackage_preferences", MODE_PRIVATE, MODE_MULTI_PROCESS) 

をこれは、次のと同じですか?二一

SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences() 

1)私はフラグを指定することはできません、またはそれらを指定する方法はありますか?

2)は私がサービスPreferenceActivity両方から共有設定を変更する/アクセスてるので、私は本当にMODE_MULTI_PROCESSを指定する必要がありますか?ほとんどの場合、プロパティを変更するPreferenceActivityがあり、それらを読み取る/変更する別のアクティビティがあるため、ほとんど常に常にMODE_MULTI_PROCESSが必要です。または、への複数の同時アクセスがある場合にのみ必要です。 MODE_MULTI_PROCESSのドキュメントはこの動作は、時には例で望まれていると言う

3(あなたがPreferenceActivityで設定を編集している間、アクティブにできるバックグラウンドサービスと、私の場合のように)SharedPreferencesアプリケーションには複数のプロセスがありますすべて同じSharedPreferencesファイルに書き込むと、これは私のサービスと私のPreferenceActivityが異なる環境設定ファイルを指している可能性がありますか?どのようにしてPreferenceActivityの環境設定ファイル名を変更しますか?

4)共有設定は、アプリケーションのすべてのコンポーネント(アクティビティ、サービスなど)で共有されるため、この方法で名前が付けられます。共有されていない環境設定(つまり、あなたのアクティビティでgetPreferences())は、それらを作成するコンポーネントに対してローカルですが、同じ* com.mypackage_preferences *ファイルに保存されていますか?これは、あなたが別のプロセスから嗜好をアクセスしている場合にのみMODE_MULTI_PROCESSを必要とするポイント3)

答えて

3

に私の疑問に答えることができます。共有の優先順位を使用しているアクティビティが異なる場合は、MODE_MULTI_PROCESSは必要ありません。

あなたはサービスがあると言います。サービスがアクティビティと同じプロセスで実行されている限り、依然としてMODE_MULTI_PROCESSは必要ありません。マニフェストの<service>タグにandroid:process="..."を指定していない限り、サービスはデフォルトで同じプロセスで実行されます。

+0

アクティビティが強制終了されて再起動され、起動時にサービスが開始されても、同じプロセスで実行されますか?つまり、システムはサーバーを認識し、アクティビティは同じパッケージに属し、同じプロセスでそれらを実行しますか?これは私にとって非常に奇妙に聞こえる、私は彼らが同じプロセスで実行されていないと思ったアクティビティはサービスを開始しないかもしれない、またはそれを開始することができますし、それは、サーバーがまだバックグラウンドで実行されて殺されることができますバックグラウンドサービスと私はそれを停止しない限り、停止しないでください)。 –

+0

あなたは、私がサービスを別のプロセスで実行させたいという指定のためにandroid:process属性を設定する方法を簡単に説明できますか?その場合、ユーザーがタスクを開始したアクティビティを(つまりタスクマネージャを介して)強制終了すると、サービスが強制終了されるのを避けることができますか?さらに、BOOT_COMPLETEDイベントをインターセプトするブロードキャスト受信者によってサービスが開始された場合、そのサービスは独自のプロセスで動作し、後でそのサービスのstartServiceを呼び出すアクティビティのインテントを受信しますか? –

+1

マニフェスト内の ''タグに 'android:process'属性を明示的に設定しないと、サービスとアクティビティはすべて同じ仮想マシン内の同じプロセスで実行されます。これがデフォルト動作です。 OSは依然としてサービスとアクティビティを個別に制御し、通常どおり起動し、停止します。サービスを別のプロセスで実行させたい場合は、マニフェストの 'タグに' android:process = ":service"を指定してください。これにより、サービスはアプリケーション専用の別のプロセスで実行されます。 –

0

他の大きな利点:ビジー状態のサービスでガベージコレクトが発生しても、ユーザーインターフェイスのアニメーションに干渉することはありません。