web-dev-qa-db-ja.com

サービスからアクティビティを通知

私はServiceからActivityを開始してWebページの変更を探しています。これはプライベートアプリなので、バッテリーの寿命を気にしません...

しかし、ServiceからActivityにデータを渡したい... ActivityからServiceを呼び出す方法が見つからないようです。どうすればこれを達成できますか?

41
Mars

Alexが示したように、サービスにバインドし、イベントで使用するために、何らかのリスナーまたはコールバックをサービスに渡すことができます。

または、ブロードキャストIntentを使用して、おそらくIntentsetPackage()などのメソッドを使用して、ブロードキャストのスコープを制限できます。

または、createPendingResult()を使用してPendingIntentを作成し、Intent extraとしてサービスに渡すことができます。サービスはそのPendingIntentを使用できますアクティビティでonActivityResult()をトリガーします。

または、ResultReceiverを使用できます。

または、Messengerを使用できます。

(確かに、私は後者の2つのアプローチを試したことはありませんが、ここでうまくいくと思います)

47
CommonsWare

もう1つの選択肢:サービスがコンテンツプロバイダーを更新する場合、アクティビティは ContentObserver で通知できます。サービスがサーバーからデータをダウンロードし、アクティビティの新しいコンテンツを表示するだけの場合、これで十分です。

3

いくつかのい方法:

1.)アクティビティがまだ開始されていない場合は、intentstartActivityを使用しますが、intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);を覚えておいてください

2.)または、アクティビティが既に開始されている場合は、アクティビティに独自のコールバックメソッドを記述し、サービスにメソッドを登録してから、サービスでメソッドを直接呼び出すことができます。

賢い方法を見つけたい。

ブロードキャストもうまく機能すると思います。ブロードキャストを受信して​​アクティビティを開始する静的な内部クラスを作成できます。しかし、それはまた私の意見ではいです。

1
vvsueprman

ResultReceiverメカニズムは別の投稿で説明されています:- Restful APIサービス ただし、すべての場合に機能するわけではありません。その投稿に対する私のコメントを参照してください。限定された範囲のブロードキャストまたはPendingIntentメカニズムがより適しているようです。

0
Nikhil_Katre