web-dev-qa-db-ja.com

サービスはどのようにしてリアルタイムでアクティビティと通信すべきですか?

サービスはどのようにしてリアルタイムでアクティビティと通信すべきですか?

BroadcastReceivers 遅すぎて信頼できないようです。時々彼らは遅すぎるように見えるか、完全に機能しなくなります。例として、私のテストアプリケーションの1つでブロードキャストを送信してから受信するまでに数分の遅延がありました。

従来のコールバックを確実に機能させることができません。私はあなたがそうすべきではないと確信しています。

サービスのバインド のオプションがあります。リアルタイム通信に適していますか?

小さな整数の更新を1秒あたり約20(編集)回送信するつもりです。

私は正しい方向を見ていますか?

この質問の範囲を狭めるには:

私のアプリケーションはオーディオMe​​diaPlayerです。 MediaPlayerをホストするサービスが必要です。 MediaPlayerサービスから、主に再生中のオーディオの現在の位置で構成される更新をGUIに送信したいと考えています。

私の質問は-バインドされたサービスはこのタスクに適していますか?そうでない場合、どのような選択肢がありますか?

3
David

Androidでは、そのタスクを開始したユーザーインターフェイス要素がフォアグラウンドでなくなった場合でも、サービスを使用してバックグラウンドタスクを実行します。

例:ユーザーがサーバーに動画をアップロードしたいソーシャルネットワーキングアプリでは、動画のアップロードをリクエストしたアプリケーションがフォアグラウンドでなくても、動画は引き続きバックグラウンドでアップロードされます(たとえば、ユーザーはそれまでの間の電話)。

私はあなたのケースでは、ユーザーインターフェイス要素(音楽アプリ)がフォアグラウンドにない場合でも曲を再生し続けたいと考えています。

したがって、間違いなくサービスこそが道です。

Androidには2種類のサービスがあります( http://developer.Android.com/guide/components/services.html

  • 開始済みサービス:中間更新が不要な長時間実行タスクに使用されます。たとえば、動画をバックグラウンドでアップロードし、アップロードが成功または失敗であったことのみをユーザーに知らせる場合は、開始されたサービスを使用し、通知を使用してステータス(成功または失敗)をユーザーに通知します。
  • バインドされたサービス:呼び出し元(この場合はアプリ)とサービスの間にクライアント/サーバー関係がある長期実行タスクに使用されます。

Androidでは、startedおよびbound同時に。このようなサービスを作成することをお勧めします。サービスのstarted部分が曲を再生しますバックグラウンドとサービスのbound部分は、再生中の曲の現在の位置の更新を提供します。

それまでの間、アプリがバックグラウンドで実行されると、サービスが開始されたため、現在の位置の更新を提供せずに曲が再生され続けます歌。

2
Anay Tamhankar

Pending Intent、Event Bus、またはMessengerを使用して、アクティビティのあるサービスからリアルタイムで通信することもできます。以下のリンクにある私のブログ投稿をチェックして、これらのアプローチすべてを例で説明します-

https://androidlearnersite.wordpress.com/2018/02/23/communicating-from-services/

保留中の意図

サービスとアクティビティの間の通信はPendingIntentを使用して行うことができます。そのために、サービスに渡して結果データをonActivityResult(int、int、Intent内のアクティビティに送り返すために渡すことができる新しいPendingIntentオブジェクトを作成するcreatePendingResult()を使用できます。 )コールバック。PendingIntentはParcelableであるため、インテントエクストラに入れることができるため、アクティビティはこのPendingIntentをサービスに渡すことができます。サービスは、PendingIntentのsend()メソッドを呼び出して、onActivityResultを介してアクティビティに通知できます。イベントの。

イベントバス

イベントバスを使用してアクティビティまたはフラグメントがリッスンして応答できるイベントを発生させるサービスを提供できます。イベントバスは this 説明されているライブラリ here を使用して統合できます。

メッセンジャー

メッセンジャーはハンドラーへの参照であり、他のユーザーがハンドラーにメッセージを送信するために使用できます。メッセンジャーは分割可能であるため、インテントエクストラに入れることができるため、アクティビティはこのメッセンジャーをサービスに渡すことができます。サービスは、メッセージオブジェクトに必要なデータを入力しますイベントをアクティビティに送信する必要がある場合は常に、メッセージオブジェクトをパラメーターとして指定してMessengerでsend()を呼び出す必要があります。アクティビティ内のハンドラーは、メインアプリケーションスレッドのhandleMessage()を介してメッセージを受信します。 UIを更新したり、必要な操作を実行したりできます。

3