起動 - android:process 属性




Android-別のプロセスでサービスを実行するかどうかを決定する方法 (3)

RAM使用量の削減

Androidデベロッパーのドキュメントによれば、これはサービスのRAM使用率を低く抑えることが適切であることを示唆しています。

あなたのアプリケーションのメモリ管理から:複数のプロセスを使用する

複数のプロセスが適切な場合の例は、長時間にわたってサービスから音楽を再生する音楽プレーヤーを構築する場合です。 アプリ全体が1つのプロセスで実行されている場合、ユーザーが現在別のアプリに入っていてサービスが再生を制御していても、アクティビティUIのために実行された割り当ての多くは、音楽を再生している限り保持する必要があります。 このようなアプリは2つのプロセスに分割されます.1つはそのUI用で、もう1つはバックグラウンドサービスで実行し続ける作業用です。

したがって、サービスを別のプロセスで実行すると、結果的にアプリケーションのパフォーマンスへの影響を減らすことができます。同時に、システムのRAMが不足しているときにサービスが停止する可能性も低くなります。

パフォーマンスの低下を軽減

あなたのアプリケーションのメモリ管理から:アプリケーションの切り替え

キャッシュされたプロセスがあり、現在必要ではないメモリを保持しているアプリケーションは、ユーザーがアプリケーションを使用していなくても、システムの全体的なパフォーマンスが制約されます。 したがって、システムのメモリが不足すると、LRUキャッシュ内のプロセスは、使用頻度が最も低いプロセスから開始されますが、どのプロセスが最もメモリ集中型であるかを考慮する必要があります。

殺される可能性の低減

あなたのアプリケーションのメモリ管理から:メモリが解放されるにつれてメモリを解放する

注:システムがLRUキャッシュでプロセスを終了するとき、主にボトムアップで動作しますが、どのプロセスがより多くのメモリを消費しているかを考慮します。 したがって、LRUリスト全体で消費しているメモリが少ないほど、リストに残り、すぐに再開できる可能性が高くなります。

したがって、サービスがUIリソースを共有していないため、プロセスのRAM使用量が少なくなるため、サービスが別のプロセスにあるときにサービスが停止する可能性は低くなります。

これを行うとき

あなたのサービスがstartForeground()使用していない場合は、RAMを解放する必要があるときにAndroidがそれを殺すだけであるため、サービスのRAM消費量はそれほど重要ではありません。 したがって、OSやその他のアプリケーションのパフォーマンスへの影響だけを考えているなら、別のプロセスでサービスを実行する価値はないと思います。

しかし、 startForeground()使用すると、Androidはサービスを可能な限り生かし続けるようになるため、プロセスが使用する RAMはすべてOSや他のアプリケーションに影響を与えます。 この場合、別のプロセスを使用することをお勧めします。これにより、少なくとも10MBのRAMを節約できるため、ユーザーのデバイスの処理速度を低下させることはありません。

また、アプリのマルチプロセスを簡単にすることは難しいことに注意してください。 AndroidのSharedPreferencesは複数のプロセスをサポートしていません。 私は私のプロジェクトの一つで複数プロセスSharedPreferences実装を作っが、私はまだ再利用のためにそれを公開していない。

私は、複数時間にわたりセンサーデータを収集するAndroidアプリケーションを開発中です。 そのために、センサデータ(例えば、加速度、GPSなど)を収集し、処理してサーバ上に遠隔的に格納するサービスがあります。

現在、このサービスは別のプロセスで実行されています(マニフェストではandroid:service = ":background"を使用しています)。 これは、アクティビティとサービスの間のコミュニケーションを複雑にしますが、私の前任者は、アクティビティからサービスを分離することにより、サービスをより安定させると考えたため、このようにアプリケーションを作成しました。

私は、別のプロセスを実行するための実際の理由をいくつかおきたいと思います。 利点は何ですか? それは本当により安定して実行されますか? サービスが別のプロセスにある場合、OSによって(リソースを解放するために)サービスが殺される可能性は低いですか?

私たちのアプリケーションは、OSによって殺される可能性を最小限に抑えるためにstartForeground()とフレンドを使用しています。

Androidのドキュメントでは、このことについてはあまり詳しくは書かれていませんが、主にアプリケーションの目的によって異なります

TL; DR長時間実行するサービスを別のプロセス(Android)に置く理由は何ですか?


サービスを別のプロセスで実行するように分割しても、それが安定するわけではありませんが、アプリケーションがより安定している場合、アプリケーションがクラッシュせずに回復できます。

エリ


まず最初に、 コンポーネントのライフサイクルの説明を読みます 。 それは、 Serviceや他のコンポーネントが長期間実行されることを保証するものではありません。

しかし、あなたが説明する機能のためには、 Serviceが正しい選択であるように思えます。 これは、ユーザーが直面していない操作を行っているためです。 ライフサイクルの説明に戻ると、アクティビティがフォアグラウンドにないときはいつでも、それは本質的に殺される候補です。

AlarmManagerを使用して定期的に Service 起動することを検討する必要があります。 @CommonsWareが作成したWakefulIntentライブラリを使用してWakefulIntentこともできます。

Androidのマルチタスキングと呼ばれるAndroidのブログでマルチタスキングとプロセスを説明している良い記事があります。興味のあるプロセスに関する詳細をいくつか取り上げる可能性があります。

Androidのマルチタスクに関する一般的な誤解は、プロセスとアプリケーションの違いです。 Androidでは、これらは密接に結合されたエンティティではありません。実際にアプリケーションを実行している実際のプロセスがなくても、アプリケーションはユーザーに見えるかもしれません。 複数のアプリケーションがプロセスを共有したり、1つのアプリケーションがそのニーズに応じて複数のプロセスを使用することがあります。 そのアプリケーションが積極的に何かをやっていないときでさえ、アプリケーションのプロセスはAndroidによって保持されるかもしれません。





service