web-dev-qa-db-ja.com

サービスからのアクティビティとの通信(LocalService)-Androidベストプラクティス

一般的なシナリオ-サーバーをポーリングするためのバックグラウンドサービスを使用したアクティビティ。

サービスはAlarmManagerを介して定期的に実行され、アクティビティのタスクも実行します(ユーザーがボタンを押すと、サーバーから何かをフェッチします)。

ここでベストプラクティスを知りたいのですが。最良の設計はAndroid LocalServiceの例: http://developer.Android.com/reference/Android/app/Service.html#LocalServiceSample

ただし、この例では、アクティビティにはアクティビティmBoundServiceへの参照がありますが、逆接続はありません(サービスにはアクティビティを呼び出す方法がありません)。

サービスがアクティビティを呼び出すための最良の方法は何ですか?

インテント、BroadcastReceivers、メッセージを使用しますか?どうやって?

20
paulpooch

最良の設計はAndroid LocalServiceの例: http://developer.Android.com/reference/Android/app/Service.html#LocalServiceSample

私はしません。立つことができる最も緩いカップリングを使用してください。したがって、平均して、startService()を使用したバインディングパターンではなく、bindService()を使用したコマンドパターンを目指します。特に、構成の変更(画面の回転など)を処理する場合、バインドは少し面倒です。

サービスがアクティビティを呼び出すための最良の方法は何ですか?インテント、BroadcastReceivers、メッセージを使用しますか?どうやって?

サービスからのアクティビティの通知 を参照してください

9
CommonsWare

BindService()を使用してアクティビティ間で緊密な結合が必要な場合、通信の方法は、通信の発信元によって異なります。

サービスが発信されている場合(共有する新しい情報があるアラームなど)、通常はブロードキャストを送信します。

アクティビティが発生している場合(例として「サーバーから何かをフェッチする」など)、AsyncTaskなどを使用して非同期で処理できます。つまり、AsyncTask.doInBackground()でサーバーからフェッチし、結果をAsyncTask.onPostExecuteのアクティビティにポストバックできます。要求された操作に非常に長い時間がかかると予想される場合、このシナリオは少し複雑になります。その場合、それを切り離して、代わりにサービスからブロードキャストを送り返します。

1
prunicki

書かれているように ここ

サービスからサービスを開始していないアクティビティまたはフラグメントに通信する場合、またはサービスから複数のアクティビティ/フラグメントに通信する場合は、イベントバスまたはブロードキャストインテントを使用できます。これらは任意のアクティビティまたはフラグメントのイベントのコールバックを受信できるためです。サービスからサービスを開始したアクティビティ/フラグメントに通信する場合は、保留中のインテントまたはメッセンジャーを使用して、それらをインテントエクストラに入れてサービスに渡すことができます。

保留中の意図

CreatePendingResult()を使用して、新しいPendingIntentオブジェクトを作成します。このオブジェクトをサービスに渡して使用し、onActivityResult(int、int、Intent)コールバック内で結果データをアクティビティに送り返すことができます。

イベントバス

イベントバスを使用して、アクティビティまたはフラグメントがリッスンして応答できるイベントをサービスに発生させることができます。

メッセンジャー

メッセンジャーはパーセル可能であるため、インテントエクストラに入れることができるため、アクティビティはこのメッセンジャーをサービスに渡すことができます。サービスは、送信する必要のあるデータをメッセージオブジェクトに入力します。

ブロードキャストインテント

サービスは、アクティビティによって応答できるブロードキャストを送信できます。

0