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