Serviceの2つの起動方法の比較と違い

Android では、Service を開始するには主に 2 つの方法があります。ブートアップ起動とバインド起動です。

1. サービスの開始 (サービスの開始):

  • `startService()` メソッドを使用してサービスを開始します。
  • サービスは、それを開始したコンポーネント (アクティビティなど) から独立して、バックグラウンドで実行されます。
  • サービスを開始すると、`stopSelf()` または `stopService()` メソッドを呼び出して停止するか、`onDestroy()` メソッドを呼び出してシステムによって破棄されるまで、サービスは実行され続けます。
  • Serviceのライフサイクルメソッドでは、最初の起動時にonCreate()が呼び出され、起動要求の処理にonStartCommand()が使われ、Serviceの破棄時にonDestroy()が呼び出されます。
  • ブートストラップ起動により、サービスを開始したコンポーネントが破棄された場合でも、サービスは長時間実行の計算を実行したり、バックグラウンドで非同期タスクを処理したりできます。

2. バインディングの開始 (バインドサービス):

  • `bindService()` メソッドを使用してサービスを開始します。
  • サービスは、それを開始するコンポーネント (アクティビティなど) とバインディング関係を確立し、コンポーネント間の対話と通信を可能にします。
  • Service をバインドした後、返された IBinder オブジェクトを通じて、コンポーネントは Service で公開されているメソッドを呼び出して特定の操作を実行できます。
  • バインディング開始は、サービスと対話したり、結果を取得したり、リモート呼び出しを実行したりする必要がある状況に適しています。
  • バインディング関係は、「unbindService()」メソッドを呼び出すことで解放できます。サービスにコンポーネントがバインドされなくなると、システムはサービスを破棄します。
  • Service のライフサイクル メソッドでは、最初にバインドされたときに `onCreate()` が呼び出され、コンポーネントに IBinder オブジェクトを返すために `onBind()` が使用され、すべてのコンポーネントがバインドされていないときに `onUnbind()` が呼び出されます。 Service が破棄されると、 Service から `onDestroy()` が呼び出されます。

主な違い:

  1. ライフサイクル: スタートアップによって開始されたサービスは、それを開始したコンポーネントが破棄された場合でも、バックグラウンドで実行し続けることができます。バインディングで開始されるサービスは、それを開始するコンポーネントとのバインディング関係を確立し、少なくとも 1 つのコンポーネントがバインドされている場合にのみ実行され、すべてのコンポーネントのバインドが解除されると破棄されます。
  2. インタラクションと通信: バインド開始サービスにより、コンポーネントとサービスの間のインタラクションと通信が可能になり、返された IBinder オブジェクトを通じてサービス内のメソッドを呼び出すことができます。スタートアップ サービスは通常、バックグラウンド タスクを実行するために使用され、コンポーネントと直接対話しません。
  3. ライフサイクル管理: `stopSelf()` または `stopService()` メソッドを呼び出すことで、ブート開始されたサービスを明示的に停止できます。バインド開始されたサービスの場合、システムはすべてのコンポーネントのバインドが解除された後にのみサービスを破棄します。
  4. 結果を返す: バインド開始サービスはコンポーネントに結果を返すことができますが、ブート開始サービスは通常結果を返さず、ブロードキャストまたはコールバックを通じて間接的に結果を送信できます。

実際のアプリケーションでは、2 つの方法の選択はニーズによって異なります。コンポーネントを操作せずにバックグラウンドでいくつかのタスクを実行する必要があるだけの場合は、ブートストラップの方が適切な選択です。サービスと対話したり、結果を取得したり、リモート呼び出しなどの操作を実行したりする必要がある場合は、バインドされたスタートアップを選択することをお勧めします。

おすすめ

転載: blog.csdn.net/m0_52537869/article/details/131094564