web-dev-qa-db-ja.com

サービスがアクティビティに結果を返す方法

私は古典的な仕事をしているようですが、それを行う方法の例を見つけることができません。

何かをダウンロードしたいのですが。さて、私はWebサービスを呼び出して応答を取得します...しかし、それはほとんど同じです。

これを行うために、ジョブを実行するスレッドを生成するサービスを開始するアクティビティがあります。

次に、サービスを開始したアクティビティで取得したデータを使用します。

(結果を表示するジョブを処理する別のアクティビティを開始するのは簡単だと思います)

私の問題は、サービスが何か(それを開始したアクティビティまたは別のアクティビティ)に何かを通知する方法ですか?

例へのポインタは大歓迎です。

よろしく

28
Alex Poke

アクティビティがBroadcastReceiverで取得するsendBroadcast()を介して、データとともにブロードキャストインテントを送信します。

その例を次に示します。 https://github.com/commonsguy/cw-Android/tree/master/Service/WeatherAPI Doc: http://developer.Android.com/ reference/Android/content/BroadcastReceiver.html

8
fpanizza

Googleのドキュメントによると、ActivityServiceが同じアプリ内にある場合、送信される情報が送信されないため、sendBroadcast(インテント)よりも LocalBroadcastManager を使用することをお勧めします傍受のリスクを排除するシステムを通じて。

使い方はとても簡単です。

アクティビティでBroadcastReceiverを作成し、onResume()メソッドにリスナーを動的に追加します。

private BroadcastReceiver  bReceiver = new BroadcastReceiver(){

    @Override
    public void onReceive(Context context, Intent intent) {
        //put here whaterver you want your activity to do with the intent received
    }           
};

protected void onResume(){
    super.onResume();
    LocalBroadcastManager.getInstance(this).registerReceiver(bReceiver, new IntentFilter("message"));
}

protected void onPause (){
    super.onPause();
 LocalBroadcastManager.getInstance(this).unregisterReceiver(bReceiver);
}

そして、サービスでは、LocalBroadcastManagerのインスタンスを取得し、それを使用してインテントを送信します。私は通常、次のような独自の方法でそれを入れます:

private void sendBroadcast (boolean success){
    Intent intent = new Intent ("message"); //put the same message as in the filter you used in the activity when registering the receiver
    intent.putExtra("success", success);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
54
JDenais

ユーザー定義クラスなど、さまざまなタイプのデータを返す必要がある場合は、bindServiceとコールバックを試すことができます。これにより、sendBroadcastよりもパーセル可能なインターフェースの実装を回避できます。

私の投稿の例をご覧ください:

https://stackoverflow.com/a/22549709/2782538

さらに、IntentServiceを使用すると、ResultReceiverを調べることができます。詳細とサンプルはこの投稿にあります:

Android:RESTful APIサービス

それが役に立てば幸い。

4
Euporie

Pending IntentEvent BusMessengerまたはBroadcast Intentsサービスからデータを取得してアクティビティ/フラグメントに戻し、いくつかの操作を実行するデータについて。

私のブログ投稿 は、これらすべてのアプローチをカバーしています。

1