バインド可能なスティッキー サービスを作成しようとしています (サービスが保持する一部のデータに対して、バックグラウンドで潜在的に非同期の操作を実行する必要があります)。これを行うには、onBind が常に onStartCommand の後に実行されるようにする必要があります。これを保証する方法はありますか?
3 に答える
あなたの要件から、おそらくあなたの にバインドする必要はありませんService
。IntentService
このサービスは、作業が完了すると自動的に停止するため、を使用するだけで十分です。
ドキュメントから取得:
IntentService は、オンデマンドで非同期要求 (インテントとして表現) を処理するサービスの基本クラスです。クライアントは startService(Intent) 呼び出しを介してリクエストを送信します。サービスは必要に応じて開始され、ワーカー スレッドを使用して各インテントを順番に処理し、作業がなくなると停止します。
の例IntentService
:
public class MyService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
// Do some work here, get Intent extras if any, etc.
// ...
// Once this method ends, the IntentService will stop itself.
}
}
}
の作成方法の詳細については、IntentService
こちらを参照してください。
これにより、非同期操作を処理できます。また、要件の非同期部分を「壊す」フィードバックが必要な場合は、LocalBroadcastManager
or を使用できます または あなたが言ったように、 this にバインドできますService
。繰り返しますが、それはあなたが何をしようとしているのかによって異なります。
ドキュメントから、2 種類のサービスがあります。
開始
サービスは、アプリケーション コンポーネント (アクティビティなど) が startService() を呼び出してサービスを開始したときに「開始」されます。開始されたサービスは、それを開始したコンポーネントが破棄された場合でも、無期限にバックグラウンドで実行できます。通常、開始されたサービスは単一の操作を実行し、呼び出し元に結果を返しません。たとえば、ネットワーク経由でファイルをダウンロードまたはアップロードする場合があります。操作が完了すると、サービスは自動的に停止します。
バウンド
アプリケーション コンポーネントが bindService() を呼び出してサービスにバインドすると、サービスは「バインド」されます。バインドされたサービスは、コンポーネントがサービスとやり取りしたり、要求を送信したり、結果を取得したり、プロセス間通信 (IPC) を使用してプロセス全体でそれらを実行したりできるようにするクライアント サーバー インターフェイスを提供します。バインドされたサービスは、別のアプリケーション コンポーネントがバインドされている間だけ実行されます。一度に複数のコンポーネントをサービスにバインドできますが、すべてのコンポーネントがバインド解除されると、サービスは破棄されます。
注意:Service
スルーを開始しstartService()
て「無期限」に実行し、onBind()
後で呼び出してバインドすることができます。
Intent it = new Intent(this, MyService.class);
startService(it); // Start the service.
bindService(it, this, 0); // Bind to it.
実行中だけこのサービスを実行したい場合Activity
は、 を呼び出すだけonBind()
です。
Intent it = new Intent(this, MyService.class);
bindService(it, this, 0); // This will create the service and bind to it.
「デフォルト」の詳細Service
、使用方法、実装方法については、こちらを参照してください。
ユースケースに最適なものを選択するだけで、準備完了です。
ドキュメントによると:
サービスは基本的に次の 2 つの形式を取ることができます。
開始
済み サービスは、アプリケーション コンポーネント (アクティビティなど) が startService() を呼び出してサービスを開始したときに「開始」されます。
バインド
サービスは、アプリケーション コンポーネントが bindService() を呼び出してサービスにバインドするときに「バインド」されます。[..] バインドされたサービスは、別のアプリケーション コンポーネントがバインドされている間だけ実行されます。一度に複数のコンポーネントをサービスにバインドできますが、すべてのコンポーネントがバインド解除されると、サービスは破棄されます。
onStartCommand()
が常に の前に実行されるようonBind()
にするには、サービスにバインドするたびに新しいインテントをサービスに送信し続けます。これは、サービスに対する新しいインテントがトリガーされ onStartCommand()
、 への呼び出しによってbindService()
が実行されるためonBind()
です。