web-dev-qa-db-ja.com

サービスvs IntentService

IntentServiceではできないServiceを使ってできることの例を誰かに教えてもらえますか(逆も同様)。

また、IntentServiceは別のスレッドで実行され、Serviceは実行されないと考えています。それで、私の知る限りでは、それ自身のスレッドの中でサービスを開始することはIntentServiceを開始することに似ています。そうではありませんか?

誰かが私の両方の質問で私を助けることができれば幸いです。

715
roiberg

Tejas Lagvankarがこの件に関してNice post を書きました。以下はServiceとIntentServiceの主な違いです。

いつ使うの?

  • ServiceはUIなしのタスクで使用できますが、長すぎてはいけません。長いタスクを実行する必要がある場合は、Service内でスレッドを使用する必要があります。

  • IntentServiceは、通常メインスレッドと通信することなく、長いタスクで使用できます。通信が必要な場合は、メインスレッドハンドラまたはブロードキャストインテントを使用できます。もう1つの使用例は、コールバックが必要な場合です(インテントトリガータスク)。

トリガーするには?

  • ServiceはメソッドstartService()を呼び出すことで起動します。

  • IntentServiceはIntentを使って起動され、新しいワーカースレッドを生成し、メソッドonHandleIntent()がこのスレッド上で呼び出されます。

からトリガーされた

  • ServiceおよびIntentServiceは、任意のスレッド、アクティビティ、またはその他のアプリケーションコンポーネントからトリガできます。

実行します

  • Serviceはバックグラウンドで実行されますが、アプリケーションのメインスレッドで実行されます。

  • IntentServiceは別のワーカースレッドで実行されます。

制限/欠点

  • Serviceはアプリケーションのメインスレッドをブロックする可能性があります。

  • IntentServiceはタスクを並行して実行することはできません。したがって、連続するすべてのインテントはワーカースレッドのメッセージキューに入り、順次実行されます。

いつ停止するか

  • Serviceを実装した場合、その作業が終了したときにstopSelf()またはstopService()を呼び出してサービスを停止するのはあなたの責任です。 (バインディングを提供するだけの場合は、このメソッドを実装する必要はありません)。

  • IntentServiceはすべての開始要求が処理された後にサービスを停止するので、stopSelf()を呼び出す必要はありません。

1271

もし誰かが私にintentServiceを使ってやることはできてもServiceや他の方法ではできないことの例を見せてもらえれば。

定義上、それは不可能です。 IntentServiceは、Javaコードで書かれたServiceのサブクラスです。したがって、IntentServiceが実行できることはすべて、Serviceは、IntentServiceが使用するコードの関連部分を含めることによって実行できます。

独自のスレッドでサービスを開始することは、IntentServiceを開始することに似ています。そうではありませんか?

IntentServiceの3つの主な機能は次のとおりです。

  • バックグラウンドスレッド

  • バックグラウンドスレッドでIntentの自動キューイングがonStartCommand()に渡されたため、バックグラウンドスレッドで1つのIntentonHandleIntent()によって処理されている場合、他のコマンドは順番を待ってキューに入ります。

  • キューが空になったら、stopSelf()の呼び出しを介したIntentServiceの自動シャットダウン

Serviceを拡張せずにIntentServiceによってそれらのすべてを実装することができます。

147
CommonsWare

サービス

  • startService()による呼び出し
  • 任意のThreadからトリガされます
  • Main Thread上で実行
  • メイン(UI)スレッドをブロックする可能性があります。長いタスクのためにサービス内で常にスレッドを使用する
  • タスクが完了したら、stopSelf()またはstopService()を呼び出してサービスを停止するのは私たちの責任です。

IntentService

  • 通信が必要な場合、通常はメインスレッドとの通信を行わずに長いタスクを実行します。その後、HandlerまたはBroadcastReceiverによって行われます
  • Intentを介して呼び出す
  • Main Threadからトリガ
  • 別のスレッドで実行
  • タスクを並列に実行できず、複数のインテントが同じワーカースレッドにキューイングされています。
30
Umang Kothari

受け入れられた答えにポイントを追加する:

Android API内のIntentServiceの使用方法を参照してください。例えば:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

アプリ用のIntentServiceコンポーネントを作成するには、IntentServiceを拡張するクラスを定義し、その中にonHandleIntent()をオーバーライドするメソッドを定義します。

また、IntentServiceのソースコードを見てください、それはonStartCommandのようなコンストラクタとライフサイクルメソッドです...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

AsyncTaskをまとめてサービスすることは、ペイロードがそれほど大きくない多くのユースケースに最適なアプローチの1つです。あるいはIntentSerivceを拡張するクラスを作成するだけです。 Androidバージョン4.0から、すべてのネットワーク操作はバックグラウンドプロセスで行われるはずです。そうしないとアプリケーションのコンパイル/ビルドが失敗します。 UIとは別のスレッド。 AsyncTaskクラスは、UIスレッドから新しいタスクを起動する最も簡単な方法の1つを提供します。このトピックに関するさらに詳しい議論は、ブログの投稿を見てください。

from { Android開発者ガイド

IntentServiceは、要求に応じて(Intentsとして表現される)非同期要求を処理するサービスの基本クラスです。クライアントはstartService(Intent)呼び出しを介して要求を送信します。サービスは必要に応じて開始され、各インテントを順番にワーカースレッドを使用して処理し、サービスがなくなると自動的に停止します。

IntentServiceで使用されているデザインパターン

注:この「作業待ち行列プロセッサー」パターンは、一般に、アプリケーションのメインスレッドからタスクをオフロードするために使用されます。 IntentServiceクラスは、このパターンを単純化し、仕組みを整えるために存在します。それを使用するには、IntentServiceを拡張してonHandleIntent(Intent)を実装します。 IntentServiceはインテントを受け取り、ワーカースレッドを起動し、必要に応じてサービスを停止します。

すべてのリクエストは単一のワーカースレッド上で処理されます - それらは必要なだけかかるかもしれません(そしてアプリケーションのメインループをブロックすることはありません)が、一度に一つのリクエストだけが処理されるでしょう。

IntentServiceクラスは、単一のバックグラウンドスレッドで操作を実行するためのわかりやすい構造を提供します。これにより、ユーザーインターフェイスの応答性に影響を与えずに長時間の操作を処理できます。また、IntentServiceはほとんどのユーザーインターフェイスライフサイクルイベントの影響を受けないため、AsyncTaskをシャットダウンするような状況でも引き続き実行されます。

IntentServiceにはいくつかの制限があります。

それはあなたのユーザーインターフェースと直接対話することはできません。結果をUIに入れるには、それらをアクティビティに送信する必要があります。作業要求は順次実行されます。操作がIntentServiceで実行されていて、それに別のリクエストを送信した場合、そのリクエストは最初の操作が終了するまで待機します。 IntentServiceで実行されている操作は中断できません。ただし、ほとんどの場合

IntentServiceは単純なバックグラウンド操作に適した方法です。

**

バレーボール図書館

Androidネットワーキングアプリケーションを開発するためのバレーライブラリ と呼ばれるライブラリがあります。_ソースコードはGitHubで一般に公開されています。

バックグラウンドジョブのベストプラクティス のAndroid公式ドキュメント:インテントサービス、スレッド、ハンドラー、サービスに関する理解を深めるのに役立ちます。また、 ネットワーク操作の実行

12
Sree Rama

IntentService

IntentServiceは独自のスレッドで実行されます。それが終わったらそれはそれ自身を止めるでしょう。火のようにもっと忘れて。後続の呼び出しはキューに入れられます。キューイングに適しています。 IntentService内で必要に応じて複数のスレッドをスピンすることもできます。これはThreadPoolExecutorを使用して実現できます。これは、多くの人が「なぜIntentServiceを使うのは並列実行をサポートしていないのですか」と私に尋ねたからです。 IntentServiceは単なるスレッドです。あなたはその中で必要なことは何でもすることができます - 複数のスレッドを回転させることさえ。唯一の注意点は、これらの複数のスレッドをスピンするとIntentServiceが終了することです。それらのスレッドが戻ってくるのを待ちません。あなたはこれの世話をする必要があります。だから私はそれらのシナリオでThreadPoolExecutorを使うことを勧めます。

  • 同期、アップロードなどに適しています…

サービス

デフォルトではServiceはメインスレッドで実行されます。仕事をするにはワーカースレッドを回す必要があります。明示的にserviceを停止する必要があります。あなたがあなたのアプリから離れてヘッドレスserviceのためにもっと戻って来たとしてもあなたがバックグラウンドでものを実行する必要があるとき私は状況のためにそれを使いました。

  • 必要ならば、ここでも複数のスレッドを実行できます。
  • 音楽プレーヤーなどのアプリに使用できます。

必要に応じて、BroadcastReceiversを使用していつでもあなたの活動に返信することができます。

10
Sayooj Valsan

'Android IntentService vs Service'のようなものを単純に検索することで、さまざまな違いの一覧を見つけることができるはずです。

例ごとのより重要な違いの1つは、IntentServiceが終了すると自動的に終了することです。

いくつかの例(すぐに完成する)があります。

IntentService:アプリの起動時に大量の画像をダウンロードする場合。これは1回限りのプロセスであり、すべてがダウンロードされたらそれ自身をクリーンアップできます。

サービス:アプリとバックエンドの間でWeb API呼び出しを使用して通信するために常に使用されるサービス。現在の作業が終わっても、コミュニケーションをよくするために、数分後に作業を続けたいと思うでしょう。

10

IntentServiceは、バックグラウンドおよび独立したスレッドで実行する必要があるタスクの実行を容易にするために作成されたServiceの拡張です。

IntentServiceが起動し、スレッドを作成し、そのタスクをスレッド内で実行します。一度実行されると、それはすべてをきれいにします。同時に実行できるIntentServiceのインスタンスは1つだけです。複数の呼び出しがキューに入れられます。

それは使用するのが非常に簡単で、多くの使用のために非常に便利です、例えばものをダウンロードすること。しかし、それはあなたが代わりにもっと基本的な(単純ではない)サービスを使いたくなるような制限を持っています。

たとえば、xmppサーバーに接続され、アクティビティによって制限されているサービスは、IntentServiceを使用して簡単には実行できません。 IntentServiceのものを無視したり、上書きしたりすることになります。

8
njzk2

車輪を再発明しないでください

IntentService extends Service classこれは明らかにIntentServiceが意図的に same 目的で作られていることを意味します。

だから目的は何ですか?

`IntentServiceの目的は、心配することなくバックグラウンドタスクを実行しやすくすることです。

  • ワーカースレッドの作成

  • 処理マルチリクエストを1つずつキューに入れる(Threading

  • Serviceを破棄する

そのため、 _ no _ Serviceは、IntentServiceが行うことになるすべてのタスクを実行できます。要件が上記の基準に該当する場合は、それらのロジックをServiceクラスに記述する必要はありません。 IntentServiceは発明されたホイールなので、ホイールを再発明しないでください。

「主な」違い

IntentServiceが別のスレッドで実行されている間、サービスはUIスレッドで実行されます。

IntentServiceはいつ使用しますか?

アクティビティの範囲を超えて存在する複数のバックグラウンドタスクを1つずつ実行する場合は、IntentServiceが最適です。

IntentServiceからServiceを作成する方法

通常のサービスはUIスレッド上で実行されます(デフォルトでは、すべてのAndroidコンポーネントタイプがUIスレッド上で実行されます(例:ActivityBroadcastReceiverContentProvider、およびService)。あなたが完了するまでに時間がかかるかもしれないいくつかの作業をしなければならないなら、あなたはスレッドを作成しなければなりません。複数のリクエストがある場合は、synchronizationを処理する必要があります。 IntentServiceには、あなたに代わってそれらのタスクを実行するデフォルトの実装が与えられています。
開発者ページに従ってください

  1. IntentServiceはワーカースレッドを作成します

  2. IntentServiceonHandleIntent()メソッドにリクエストを一つずつ送信するワークキューを作成します

  3. 作業がない場合、IntentServicestopSelf()メソッドを呼び出します。
  4. NullのonBind()メソッドのデフォルト実装を提供します
  5. Intent要求をWorkQueueに送信し、最終的にonStartCommand()に送信するonHandleIntent()のデフォルト実装
7
Rohit Singh

誰かが私にIntentServiceを使ってできることとserviceを使ってはできないことの例を私に見せることができればその逆もあります。

IntentServiceはロングタイムリスニングには使用できません。XMPPリスナーはその単一のタイムオペレータであり、仕事をしてさよならを振るいます。

また、スレッドワーカーは1人だけですが、トリックがあれば無制限に使用できます。

5
user3764748

ServiceIntentServiceの主な違いは以下の通りです。

サービス:

1.デフォルトではServiceがアプリケーションのメインスレッドで実行されます(ここではデフォルトのワーカースレッドは使用できません)。ユーザーは別のスレッドを作成し、そのスレッドで必要な作業を行う必要があります。

2.一度に複数のリクエストを許可する(マルチスレッド)

IntentService:

1.さて、IntentServiceに来て、ここでデフォルトのワーカースレッドがどんな操作を実行するのにでも利用可能です。 注意してください - あなたはバックグラウンドの仕事をすることができるそれぞれの開始要求の意図を受け取るonHandleIntent()メソッドを実装する必要があります。

2.ただし、一度に1つの要求しか許可しません。

4
Narendrakumar