IntentService
で実行でき、で実行できないService
(およびその逆)の例を探していますか?
IntentService
また、 a は別のスレッドで実行され、 a は実行されないと考えてService
います。したがって、私が見る限り、独自のスレッド内でサービスを開始することは、IntentService
. あれは正しいですか?
IntentService
で実行でき、で実行できないService
(およびその逆)の例を探していますか?
IntentService
また、 a は別のスレッドで実行され、 a は実行されないと考えてService
います。したがって、私が見る限り、独自のスレッド内でサービスを開始することは、IntentService
. あれは正しいですか?
Tejas Lagvankar は、このテーマについて素晴らしい記事を書きました。Service と IntentService の主な違いを以下に示します。
いつ使う?
Serviceは UIのないタスクで使用できますが、長すぎないようにする必要があります。長いタスクを実行する必要がある場合は、Service 内でスレッドを使用する必要があります。
IntentServiceは、通常、メイン スレッドと通信しない長いタスクで使用できます。通信が必要な場合は、メイン スレッド ハンドラーまたはブロードキャスト インテントを使用できます。もう 1 つの使用例は、コールバックが必要な場合です (インテント トリガー タスク)。
トリガーする方法は?
Serviceは method を呼び出すことによってトリガーされますstartService()
。
IntentServiceは Intent を使用してトリガーされ、新しいワーカー スレッドを生成し、onHandleIntent()
このスレッドでメソッドが呼び出されます。
トリガー元
走る
サービスはバックグラウンドで実行されますが、アプリケーションのメイン スレッドで実行されます。
IntentServiceは別のワーカー スレッドで実行されます。
制限/欠点
サービスは、アプリケーションのメイン スレッドをブロックする場合があります。
IntentServiceはタスクを並行して実行できません。したがって、連続するインテントはすべてワーカー スレッドのメッセージ キューに入り、順次実行されます。
いつ停止しますか?
Serviceを実装する場合は、作業が完了したら、stopSelf()
またはを呼び出してサービスを停止する必要がありますstopService()
。(バインディングのみを提供する場合は、このメソッドを実装する必要はありません)。
IntentServiceは、すべての開始リクエストが処理された後にサービスを停止するため、 を呼び出す必要はありませんstopSelf()
。
誰かが私に、でできること
IntentService
とできないことの例を見せてくれたら、Service
その逆です。
定義上、それは不可能です。は、 Javaで記述されIntentService
たのサブクラスです。Service
したがって、を使用するコードの関連ビットを含めることにより、実行できることは何でもできIntentService
ます。Service
IntentService
独自のスレッドでサービスを開始することは、IntentServiceを開始することに似ています。そうじゃない?
の3つの主要な機能は次のIntentService
とおりです。
バックグラウンドスレッド
Intent
に配信されたsの自動キューイングonStartCommand()
。したがって、バックグラウンドスレッドでIntent
処理されている場合、他のコマンドは順番を待ってキューに入れられます。onHandleIntent()
キューが空になるIntentService
と、への呼び出しを介した、の自動シャットダウンstopSelf()
そのすべては、Service
を拡張せずにで実装できますIntentService
。
サービス
startService()
Thread
Main Thread
stopSelf()
または電話でサービスを停止するのは私たちの責任ですstopService()
インテントサービス
Handler
。BroadcastReceiver
Intent
Main Thread
受け入れられた回答にポイントを追加する:
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 つを提供します。このトピックの詳細については、ブログ投稿を参照してください。
IntentService は、オンデマンドで非同期要求 (インテントとして表現) を処理するサービスの基本クラスです。クライアントは startService(Intent) 呼び出しを介してリクエストを送信します。サービスは必要に応じて開始され、ワーカー スレッドを使用して各インテントを処理し、作業がなくなると停止します。
IntentService で使用する設計パターン
: この「ワーク キュー プロセッサ」パターンは、アプリケーションのメイン スレッドからタスクをオフロードするために一般的に使用されます。IntentService クラスは、このパターンを簡素化し、メカニズムを処理するために存在します。これを使用するには、IntentService を拡張し、onHandleIntent(Intent) を実装します。IntentService はインテントを受け取り、ワーカー スレッドを起動し、必要に応じてサービスを停止します。
すべてのリクエストは 1 つのワーカー スレッドで処理されます。必要なだけ時間がかかる場合がありますが (アプリケーションのメイン ループをブロックすることはありません)、一度に処理されるリクエストは 1 つだけです。
IntentService クラスは、単一のバックグラウンド スレッドで操作を実行するための単純な構造を提供します。これにより、ユーザー インターフェイスの応答性に影響を与えることなく、長時間実行される操作を処理できます。また、IntentService はほとんどのユーザー インターフェイス ライフサイクル イベントの影響を受けないため、AsyncTask をシャットダウンする状況でも引き続き実行されます。
IntentService にはいくつかの制限があります。
ユーザー インターフェイスと直接対話することはできません。その結果を UI に配置するには、それらをアクティビティに送信する必要があります。作業リクエストは順次実行されます。操作が IntentService で実行されている場合に別のリクエストを送信すると、リクエストは最初の操作が完了するまで待機します。IntentService で実行されている操作を中断することはできません。ただし、ほとんどの場合
IntentService は、単純なバックグラウンド操作に適した方法です
**
ボレー図書館
volley-libraryという android ネットワーク アプリケーションを開発するためのライブラリがあります 。ソース コードは GitHub で公開されています。
バックグラウンド ジョブのベスト プラクティスに関する Android 公式ドキュメント : インテント サービス、スレッド、ハンドラー、サービスについて理解を深めるのに役立ちます。また、ネットワーク操作の実行
「Android IntentService vs Service」などをグーグルで検索するだけで、違いの広範なリストを見つけることができると確信しています
例ごとのより重要な違いの 1 つは、IntentService が完了すると終了することです。
いくつかの例(すぐに作成された)は次のとおりです。
IntentService: アプリを開いたときに大量の画像をダウンロードする場合。これは 1 回限りのプロセスであり、すべてがダウンロードされると自動的にクリーンアップされます。
サービス: Web API 呼び出しを使用してアプリとバックエンドの間で通信するために常に使用されるサービス。現在のタスクが終了したとしても、より多くのコミュニケーションを行うために、数分後にそれが必要です。
IntentService
独自のスレッドで実行されます。完了すると自動的に停止します。火のように忘れてください。後続の呼び出しはキューに入れられます。キューイング コールに適しています。必要に応じて、内部で複数のスレッドをスピンすることもできます。IntentService
これは、 を使用して実現できますThreadPoolExecutor
。IntentService
これは、「並列実行に対応していない
のになぜ使うのか」という質問が多かったためです。IntentService
は単なるスレッドです。その中で必要なことは何でもできます-複数のスレッドを回転させることさえできます。唯一の注意点は、IntentService
これらの複数のスレッドをスピンするとすぐに終了することです。それらのスレッドが戻ってくるのを待ちません。これを処理する必要があります。ThreadPoolExecutor
そのため、これらのシナリオでの使用をお勧めします。
デフォルトService
では、メイン スレッドで実行されます。ジョブを実行するには、ワーカー スレッドをスピンする必要があります。service
明示的に停止する必要があります。アプリから離れてヘッドレスのために戻ってきた場合でも、バックグラウンドで何かを実行する必要がある場合に使用しましたservice
。
必要に応じて、いつでも を使用してアクティビティに返信できます BroadcastReceivers
。
IntentService は、バックグラウンドおよび別のスレッドで実行する必要があるタスクの実行を容易にするために作成された Service の拡張です。
IntentService が開始され、スレッドが作成され、そのタスクがスレッド内で実行されます。完了すると、すべてがクリーンアップされます。同時に実行できる IntentService のインスタンスは 1 つだけです。複数の呼び出しがキューに入れられます。
使い方は非常に簡単で、ダウンロードなど、多くの用途に非常に便利です。ただし、代わりに、より基本的な (単純ではない) サービスを使用したくなるような制限があります。
たとえば、xmpp サーバーに接続され、アクティビティによってバインドされているサービスは、IntentService を使用して単純に行うことはできません。IntentService スタッフを無視またはオーバーライドすることになります。
誰かが私にあなたができること
IntentService
とできないことの例を示すことができればservice
.
IntentService
XMPPリスナーと同様に、長時間のリスニングには使用できません.1回限りのオペレーターであり、仕事をして別れを告げます。
また、スレッドワーカーは1つしかありませんが、トリックを使用すると、無制限に使用できます。
Android インテントサービスとサービス
1.サービス
2.インテントサービス
ここから参照
Service
aと anの主な違いはIntentService
次のとおりです。
サービス :
1.AService
はデフォルトで、アプリケーションのメイン スレッドで実行されます (ここでは、デフォルトのワーカー スレッドは使用できません)。そのため、ユーザーは別のスレッドを作成し、そのスレッドで必要な作業を行う必要があります。
2.一度に複数のリクエストを許可します。(マルチスレッド)
インテントサービス:
1. ではIntentService
、デフォルトのワーカー スレッドを使用して任意の操作を実行できます。注意してくださいonHandleIntent()
-バックグラウンド作業を行うことができる各開始リクエストのインテントを受け取るメソッドを実装する必要があります。
2.ただし、一度に許可されるリクエストは 1 つだけです。