809

IntentServiceで実行でき、で実行できないService(およびその逆)の例を探していますか?

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

4

11 に答える 11

1411

Tejas Lagvankar は、このテーマについて素晴らしい記事を書きました。Service と IntentService の主な違いを以下に示します。

いつ使う?

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

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

トリガーする方法は?

  • Serviceは method を呼び出すことによってトリガーされますstartService()

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

トリガー元

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

走る

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

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

制限/欠点

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

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

いつ停止しますか?

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

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

于 2013-04-02T18:57:02.880 に答える
171

誰かが私に、でできることIntentServiceとできないことの例を見せてくれたら、Serviceその逆です。

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

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

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

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

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

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

そのすべては、Serviceを拡張せずにで実装できますIntentService

于 2013-03-20T13:19:17.787 に答える
40

サービス

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

インテントサービス

  • 通信が必要な場合、通常はメインスレッドとの通信なしで長いタスクを実行しますHandlerBroadcastReceiver
  • 経由で呼び出すIntent
  • トリガー元Main Thread
  • 別スレッドで実行
  • タスクを並行して実行できず、複数のインテントが同じワーカー スレッドでキューに登録されています。
于 2014-05-19T04:47:40.987 に答える
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 つのワーカー スレッドで処理されます。必要なだけ時間がかかる場合がありますが (アプリケーションのメイン ループをブロックすることはありません)、一度に処理されるリクエストは 1 つだけです。

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

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

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

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

**

ボレー図書館

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

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

于 2014-01-02T12:22:57.190 に答える
14

「Android IntentService vs Service」などをグーグルで検索するだけで、違いの広範なリストを見つけることができると確信しています

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

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

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

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

于 2013-03-20T13:03:44.087 に答える
12

インテントサービス

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

  • 同期、アップロードなどに適しています...</li>

サービス

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

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

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

于 2015-07-19T15:51:17.270 に答える
9

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

IntentService が開始され、スレッドが作成され、そのタスクがスレッド内で実行されます。完了すると、すべてがクリーンアップされます。同時に実行できる IntentService のインスタンスは 1 つだけです。複数の呼び出しがキューに入れられます。

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

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

于 2013-03-20T13:20:30.667 に答える
6

誰かが私にあなたができることIntentServiceとできないことの例を示すことができればservice.

IntentServiceXMPPリスナーと同様に、長時間のリスニングには使用できません.1回限りのオペレーターであり、仕事をして別れを告げます。

また、スレッドワーカーは1つしかありませんが、トリックを使用すると、無制限に使用できます。

于 2014-06-22T23:57:07.503 に答える
6

Android インテントサービスとサービス

1.サービス

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

2.インテントサービス

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

ここから参照

于 2019-09-12T12:24:38.777 に答える
5

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

サービス :

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

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

インテントサービス:

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

2.ただし、一度に許可されるリクエストは 1 つだけです。

于 2015-07-18T08:25:41.307 に答える