読んだ情報と組み合わせて、Android サービスについての理解を説明します。
-
Android アプリケーションには複数のサービスを含めることができます。たとえば、音楽ソフトウェアはバックグラウンドで音楽を再生しながら、同時に音楽をダウンロードできます。
-
アプリケーションには複数のサービスを含めることができ、サービスの構成に応じて各サービスを別のプロセスで実行できます。
AndroidManifest.xml ファイルでは、
android:process
サービス コンポーネントに属性を割り当てることで、サービスの実行プロセスを制御できます。2 つのサービスのプロパティがandroid:process
異なる場合、それらは別のプロセスで実行されます。 -
構成
Android:process
プロパティが表示されない場合、サービスはデフォルトでアプリケーションのメインプロセスで実行されます。プロセス内に複数のサービスが存在する場合があります。 -
サービスを開始するには、サービスをバインドする方法とサービスを開始する方法の 2 つがあります。
-
アプリケーションプロセスとサービスのプロセス(サービスは別のプロセスを持つことができます)。
- アプリケーション プロセスが強制終了されると、メイン プロセスの下にあるすべてのサービスが破棄されます。バインドされたサービスと起動サービスを含みます。
- スタートアップ サービスが別のプロセスで実行されている場合でも、アプリケーション プロセスが強制終了された場合。それも破壊されます。独立したプロセスのサービスは依然としてアプリケーションのメイン プロセスとコンテキストに依存しているため、メイン プロセスが終了すると、これらの依存関係は存在し続けることができなくなります。
-
アプリケーションプロセスが強制終了されることと、アプリケーションプロセスが終了されることは同じではありません。
- アプリケーション プロセスの強制終了は、通常、システム リソースを再利用したり、システムのメモリ管理戦略に応答したりするために、オペレーティング システムがアプリケーション プロセスを積極的に終了することを意味します。この場合、アプリケーションプロセスの終了はオペレーティングシステムによって制御され、アプリケーション自体はそれを阻止したり介入したりすることはできません。アプリケーション プロセスが強制終了されると、そのプロセスに関連するすべてのコンポーネント、サービス、スレッドが実行を停止し、アプリケーションの状態とデータが失われます。この時点で、動作を再開するにはアプリケーションを再起動する必要があります。
- アプリケーション プロセスの終了とは、アプリケーション プロセスが正常に終了するか、ユーザーによって手動で終了されることを意味します。この場合、アプリケーションは通常のライフサイクル メソッド (onDestroy() など) またはユーザー アクション (戻るキーを押す、タスク マネージャーを使用してアプリケーションを閉じるなど) を通じてプロセスを終了します。この場合、アプリケーションはプロセスが終了する前に状態を保存するか、クリーンアップ操作を実行する機会があります。アプリケーションのプロセスが終了すると、プロセスに関連するコンポーネント、サービス、スレッドも実行を停止し、アプリケーションの状態とデータも失われる可能性があります。
-
Android デバイスのシステム タスク マネージャーを手動で使用してプロセスをクリーンアップすることは、強制終了のプロセスです。
-
プロセスを強制終了し、アプリケーション プロセスを終了すると、すべてのサービスが破壊されます。
-
起動サービスの場合:
onStartCommand
メソッドの戻り値によって、起動コマンドの処理後にシステムが実行するアクションが決まります。START_STICKY
: 実行後にメモリ不足が原因でシステムがサービスを終了した場合onStartCommand()
、システムはサービスを再作成し、メモリ リソースが十分なときに呼び出そうとしますonStartCommand()
が、最後のインテントは再配信しません。これは、サービスは開始された状態のままになりますが、以前のインテント データは復元されないことを意味します。これは、ユーザー データを保持しないサービスに役立ちます。(音楽を再生)START_NOT_STICKY
: メモリ不足により実行onStartCommand()
後にシステムがサービスを終了した場合、サービスは明示的に再度開始されるまで終了したままになります。このモードでは、サービスは再作成されず、保存されたインテント データも配信されません。これは、1 回限りのタスクを実行するサービスに適しています。(カレンダー目覚まし時計リマインダー)START_REDELIVER_INTENT
: 実行後にメモリ不足によりシステムがサービスを終了した場合onStartCommand()
、システムはサービスを再作成し、メモリ リソースが十分になったときにサービスを呼び出しonStartCommand()
、以前のインテントを再配信しようとします。これにより、サービスの再起動時に、以前に完了していないタスクの処理を継続し、以前の状態を復元できることが保証されます。(データアップロード)
-
サービスは、バインドされたサービスと開始されたサービスの両方にすることができます。このようなサービスは、破棄する前にバインドを解除して停止する必要があります。