AndroidプラットフォームでのサービスとIntentService


774

私は(とその逆)IntentServiceで実行できないもので実行できる何かの例を探していますServiceか?

私はまたIntentService、別のスレッドで実行され、Serviceそうではないと信じています。したがって、私が見る限り、独自のスレッド内でサービスを開始することは、を開始することに似ていIntentServiceます。あれは正しいですか?


45
IntentService is used for short tasks (etc) and a service is for long onesどこで読んだの?
njzk2 2013年

9
また、IntentServiceのソースコードを読むことをお勧めします。それはそれが何であり、何をするのかを非常に明確にします。
njzk2 2013年

1
コメントを見た後、質問を編集しました。
roiberg 2013年


2
前のコメント(greg7gkbによる)のリンクは、すばらしい読み物です。
DSlomer64 2016年

回答:


1348

Tejas Lagvankarがこの件に関して素晴らしい記事を書いています。以下は、ServiceとIntentServiceの主な違いです。

いつ使用するのですか?

  • サービスは、 UIなしでの作業に使用することができますが、あまりにも長くすべきではありません。長いタスクを実行する必要がある場合は、Service内のスレッドを使用する必要があります。

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

トリガーするには?

  • サービスは、メソッドを呼び出すことによってトリガーされますstartService()

  • IntentServiceがテントを使用してトリガされ、それが新しいワーカースレッドを生成し、この方法はonHandleIntent()、このスレッドで呼び出されます。

からトリガー

  • サービスIntentServiceは任意のスレッド、活性又は他のアプリケーションコンポーネントからトリガされてもよいです。

走る

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

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

制限/欠点

  • サービスは、アプリケーションのメインスレッドをブロックすることがあります。

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

いつ停止しますか?

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

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


11
短くて甘いですが、CommonsWareによるポイントを含めて回答を編集すると、多くの人が受け入れられた回答または最も賛成された回答しか読まないので、より良いでしょう
Shirish Herwade 14年

12
@Darpanサービスは、長時間実行される操作をバックグラウンドで実行できるアプリケーションコンポーネントであり、ユーザーインターフェイスを提供しません。サービスは、ホスティングプロセスのメインスレッドで実行されます。サービスは独自のスレッドを作成せず、別のプロセスで実行されません(特に指定しない限り)。つまり、サービスがCPUを集中的に使用する作業やブロッキング操作(MP3再生やネットワークなど)を行う場合は、その作業を行うためにサービス内に新しいスレッドを作成する必要があります。
ホセ・ファン・サンチェス

8
「IntentServiceはメインスレッドからトリガーする必要があります。」本気ですか?MainActivity onCreate()内で、新しいスレッド(以下のコード)からIntentServiceを呼び出しても、引き続き機能します。new Thread(new Runnable(){@Override public void run(){Intent intent = new Intent(context、HelloIntentService.class); startService(intent);}})。start();
Ashok Bijoy Debnath 14

9
@AshokBijoyDebnathあなたは正しいです!サービスIntentServicesは任意のスレッド、アクティビティや他のアプリケーションコンポーネントから起動することができます。この問題を解決するために、回答のテキストを編集しました。編集の提案をありがとう!:)
ホセ・ファン・サンチェス2014

2
大丈夫、それのために行きます!
ホセフアンサンチェス

165

誰かが私にIntentServiceaで行うことができ、aで行うことができない何かの例を示すことができService、その逆の場合。

定義上、それは不可能です。IntentServiceServiceJavaで書かれたのサブクラスです。したがって、使用するコードの関連ビットを含めることによりIntentService、実行Serviceできること、実行できることは何でもIntentServiceです。

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

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

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

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

  • キューが空になるIntentServicestopSelf()、を呼び出すことによるの自動シャットダウン

これらのすべては、Service拡張せずにによって実装できますIntentService


6
少し遅れて、しかし私はそれを発見していますServiceと呼ばれるstartServiceだけANR--を投げる前に、約10秒間実行することができIntentService、この制限持っていないようだ意図を放送し始めた
edthethird

16
@edthethird:メインアプリケーションスレッドを拘束していたからです。含むすべてのコンポーネントのすべてのライフサイクルメソッド、onStartCommand()のはService、メインアプリケーションスレッドで呼ばれています。UIをフリーズせずにこのスレッドを数ミリ秒以上拘束することはできません。数秒かかると、ANRと同等のサービスが提供されます。
CommonsWare 2013年

3
うん、私はあまりにも早くコメントしました。私はonStartCommand代わりに作業を行っていましたonHandleIntent- onStartCommandはUIスレッドで実行されているように見えますが、onHandleIntent実行用に別のスレッドが生成されます。
2013年

3
@IgorGanapolsky:実行するIntentService必要のあるonHandleIntent()作業がなくなった場合は、復帰後にそれ自体を呼び出します。
CommonsWare、2015年

1
問題は英語ではなくプログラミングです。たとえば、「私はアプリを閉じました」には正確な定義がないため、それが発生したときに何が起こるかはわかりません。また、「アプリを閉じました」と「1時間後にダウンロードする」の関係がわかりません。「1時間後にダウンロードする」という最小限の再現可能な例を提供できる別のStack Overflow質問をすることを検討することもできます。そこで、「アプリを閉じました」の意味を詳しく説明できます(たとえば、ユーザーがアプリを閉じるために具体的に何をするかなど)。
CommonsWare 2018

39

サービス

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

IntentService

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

19

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

IntentServiceServiceクラスを拡張します。これIntentServiceは、同じ目的のために意図的に作成されたことを明確に意味します。

それで、目的は何ですか?

`IntentServiceの目的は、心配することなく、バックグラウンドタスクを簡単に実行できるようにすることです

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

  • 複数のリクエストを1つずつ処理するキューイング(Threading

  • 破壊する Service

したがって、NOはServiceが実行するタスクを実行できますIntentService。要件が上記の基準に該当する場合は、それらのロジックをServiceクラスに記述する必要はありません。だから発明された車輪なので、車輪を再発明しないでくださいIntentService

「主な」違い

ServiceはUIスレッドで実行され、IntentServiceは別のスレッドで実行されます

いつIntentServiceを使用しますか?

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

IntentServiceからどのように作られていますService

通常のサービスUIスレッド上で実行されます(デフォルト等により、UIスレッド上の任意のAndroidコンポーネントタイプの実行ActivityBroadcastReceiverContentProviderおよびService)。完了するまでに時間がかかる作業を行う必要がある場合は、スレッドを作成する必要があります。複数のリクエストがある場合は、に対処する必要がありますsynchronizationIntentServiceこれらのタスクを実行するデフォルトの実装がいくつか与えられます。開発者ページに
よると

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

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

  3. 作業がない場合IntentServicestopSelf()メソッドを呼び出します
  4. onBind()nullのメソッドのデフォルト実装を提供します
  5. デフォルトの実装onStartCommand()送信Intentワークキューに、最終的に要求をonHandleIntent()

15

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

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つを提供します。このトピックの詳細については、ブログ投稿を参照してください

Android開発者ガイドから:

IntentServiceは、オンデマンドで非同期リクエスト(インテントとして表現)を処理するサービスの基本クラスです。クライアントはstartService(Intent)呼び出しを通じてリクエストを送信します。サービスは必要に応じて開始され、ワー​​カースレッドを使用して各インテントを処理し、作業がなくなると停止します。

IntentServiceで使用される設計パターン

:この「ワークキュープロセッサ」パターンは、アプリケーションのメインスレッドからタスクをオフロードするために一般的に使用されます。IntentServiceクラスは、このパターンを簡素化し、メカニズムを処理するために存在します。これを使用するには、IntentServiceを拡張し、onHandleIntent(Intent)を実装します。IntentServiceはインテントを受け取り、ワーカースレッドを起動し、必要に応じてサービスを停止します。

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

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

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

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

IntentServiceは、単純なバックグラウンド操作の推奨される方法です

**

ボレー図書館

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

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


1
あなたがポイントの答えまで、短くすることができれば、それはより良いかもしれません。
eRaisedToX 2017年

12

「Android IntentService vs Service」のようなものをググるだけで、違いの広範なリストを見つけることができると思います

例ごとのより重要な違いの1つは、IntentServiceが完了するとそれ自体が終了することです。

いくつかの例(すぐに構成されています)は次のとおりです。

IntentService:アプリを開く最初にたくさんの画像をダウンロードしたい場合。これは1回限りのプロセスであり、すべてがダウンロードされると自動的にクリーンアップできます。

サービス:Web API呼び出しを使用してアプリとバックエンド間の通信に常に使用されるサービス。それが現在のタスクで終了したとしても、より多くのコミュニケーションのために、それを数分後に残しておく必要があります。


2
片方で実行でき、もう一方では実行できない例が見つかりませんでした。役に立たなかったいくつかの説明。
roiberg 2013年

1
このサイトを試してみてください。適切な例を使用
Stefan de Bruijn

4
「使い方」のもう一つの例。特にserviceを使用する場合やintentserviceを使用する場合ではありません。理論的な例を挙げてください。 "使用方法"や他のリンクにリンクしないでください。私があなたのために「働く」ことを求めているのではありませんが、私は何もしていないので、私はそれらすべての好みをすでに見ただけで、まだわかりません。
roiberg 2013年

5
それはかなり重要な違いです。たとえば、サーバーとの永続的な接続を維持するためにサービスを使用する場合、すべてのタスクが完了した直後に終了するため、そのためにintentserviceを使用することはできません
pelotasplus

24
それをググると、ここに連れて行ってくれます。今、私は無限ループにいます。
Lou Morda、2014年

12

IntentService

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

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

サービス

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

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

BroadcastReceivers必要に応じて、いつでもアクティビティに返信できます 。


8

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

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

使い方はとても簡単で、ダウンロードなど、多くの用途に非常に便利です。ただし、代わりに、より基本的な(単純ではない)サービスを使用したくなる制限があります。

たとえば、xmppサーバーに接続され、アクティビティによってバインドされたサービスは、IntentServiceを使用して単純に実行することはできません。IntentServiceのものを無視またはオーバーライドすることになります。


どうやら、バックグラウンドで実際に長時間実行されるサービスを実行したいほとんどの人は、IntentServiceについて見つけようとするので、ドキュメントがそうするように見えるので、ほとんどの場合、新しいスレッドを使用することもできます(新しいRunnable())。start()。つまり、「新しいスレッドをスポーンする」ことだけを説明している場合、それを別のプロセスに移動することはありません。実際には、ほとんどのユーザーは、実行中のコードをアクティビティから切り離したいときに行うことを期待しています。 !(スレッドのスポーンはとにかく1つのライナーであるため)
Lassi Kinnunen

intentServiceはスレッドのライフサイクルも処理し、ルーパーを使用してスケジューラを支援します。また、1つのインスタンスのみが実行されていることを確認し、他の呼び出しをキューに入れます。
njzk2 2014

5

誰かが私にあなたが行うことができることを何かの例を示すことができる場合IntentServiceとで行うことができないserviceと、他の方法の周りを。

IntentService 長時間のリスニングには使用できません。XMPPリスナーの場合と同様に、その単一の時間オペレーターは、仕事をして別れを告げます。

また、スレッドワーカーは1つだけですが、トリックを使用すると、無制限に使用できます。


4

a Serviceとan の主な違いはIntentService次のとおりです。

サービス:

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

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

IntentService:

1.に到達するとIntentService、ここでデフォルトのワーカースレッドを使用して任意の操作を実行できます。 - onHandleIntent()各開始リクエストのインテントを受け取るメソッドを実装する必要があります。ここで、バックグラウンドの作業を実行できます。

2.しかし、一度に許可される要求は1つだけです。


3

Android IntentServiceとService

1.サービス

  • サービスは、startService()を使用して呼び出されます。
  • サービスは任意のスレッドから呼び出すことができます。
  • サービスは、デフォルトでアプリケーションのメインスレッドでバックグラウンドオペレーションを実行します。したがって、アプリケーションのUIをブロックする可能性があります。
  • サービスが複数回呼び出されると、複数のインスタンスが作成されます。
  • サービスは、stopSelf()またはstopService()を使用して停止する必要があります。
  • Androidサービスは並列操作を実行できます。

2. IntentService

  • IntentServiceは、Intentを使用して呼び出されます。
  • IntentServiceは、メインスレッドからのみ呼び出すことができます。
  • IntentServiceは、バックグラウンド操作を実行するための個別のワーカースレッドを作成します。
  • IntentServiceが複数回呼び出されても、複数のインスタンスは作成されません。
  • キューが完了すると、IntentServiceは自動的に停止します。stopService()またはstopSelf()をトリガーする必要はありません。
  • IntentServiceでは、複数のインテントコールが自動的にキューに入れられ、順次実行されます。
  • IntentServiceは、サービスのような並列操作を実行できません。

ここから参照

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.