2016-05-20 5 views
4

私はAndroidで少し遊んでいて、アクティビティとサービスを備えた小さなアプリを書いています。アクティビティはボタンクリックでサービスを開始し、URIからデータを取得して結果として返す必要があります。場合によっては、データが利用できないか、基準を満たさない場合、アクティビティがバックグラウンドであっても、X分ごとにサービスを再試行する必要があります。JobServiceからの結果を返すには?

アクティビティとサービスの間の通信は、IntentResultReceiver(バンドルに渡されます)を介して実装しました。サービスを実装する際に、新しいJobSchedulerコンポーネントを使用したかったのですが、Parcelableオブジェクト(ResultReceiver)を追加できないPersistableBundleのみを受け入れることができ、基本タイプのみを受け入れることができます。

ネットワークが利用可能になったときに実行されるジョブをスケジュールするサービスと、データをチェックするためにX分ごとにサービスを実行します。受け取ったデータは、のに返され、受け入れ可能かどうか、または再試行する必要があるかどうかを判断できます。サービスがデータを受け入れると、サービスはResultsReceiverを介してアクティビティに返します。

私は(JobInfo.Builderによって行わ)JobServiceインスタンスを作成しないので、私はそれをコールバックオブジェクトへの参照を渡すことができないJobServiceResultsReceiverを使用し、それができません。

スケジュールされたジョブとそれを呼び出したサービスとの間で通信するにはどうすればよいですか。

申し訳ありませんが、それは些細だ場合、私はAndroidのに慣れていないよ...

ありがとう!

答えて

5

スケジュールされたジョブとそれを呼び出したサービスとの間で通信するにはどうすればよいですか。

一般に、あなたはしません。あなたのサービスもあなたの活動も存在しないでしょう。 JobSchedulerの背後にある点は、あなたのアプリがもう稼働していないときにジョブを実行させることです。それ以外の方法で使用している場合は、適切ではない可能性があります。

これは、プロセス内でイベントが発生してジョブが完了したと言うイベントバスを使用することができます(緑色のロボットのEventBusが私の選択ですが、LocalBroadcastManagerもここで動作します)。あなたのサービス(または活動)は、バス上のイベントに登録し、それらのイベントが発生したときに反応します。しかし、同時に、イベントバスは、登録されたハンドラがない場合、イベントを「床に落ちる」ように完全に満足しているので、JobServiceは必要に応じてイベントを「火災と忘れ」モードで呼び出すことができます。

関連する問題