IntentService
ではできないService
を使ってできることの例を誰かに教えてもらえますか(逆も同様)。
また、IntentService
は別のスレッドで実行され、Service
は実行されないと考えています。それで、私の知る限りでは、それ自身のスレッドの中でサービスを開始することはIntentService
を開始することに似ています。そうではありませんか?
誰かが私の両方の質問で私を助けることができれば幸いです。
Tejas Lagvankarがこの件に関してNice post を書きました。以下はServiceとIntentServiceの主な違いです。
いつ使うの?
ServiceはUIなしのタスクで使用できますが、長すぎてはいけません。長いタスクを実行する必要がある場合は、Service内でスレッドを使用する必要があります。
IntentServiceは、通常メインスレッドと通信することなく、長いタスクで使用できます。通信が必要な場合は、メインスレッドハンドラまたはブロードキャストインテントを使用できます。もう1つの使用例は、コールバックが必要な場合です(インテントトリガータスク)。
トリガーするには?
ServiceはメソッドstartService()
を呼び出すことで起動します。
IntentServiceはIntentを使って起動され、新しいワーカースレッドを生成し、メソッドonHandleIntent()
がこのスレッド上で呼び出されます。
からトリガーされた
実行します
Serviceはバックグラウンドで実行されますが、アプリケーションのメインスレッドで実行されます。
IntentServiceは別のワーカースレッドで実行されます。
制限/欠点
Serviceはアプリケーションのメインスレッドをブロックする可能性があります。
IntentServiceはタスクを並行して実行することはできません。したがって、連続するすべてのインテントはワーカースレッドのメッセージキューに入り、順次実行されます。
いつ停止するか
Serviceを実装した場合、その作業が終了したときにstopSelf()
またはstopService()
を呼び出してサービスを停止するのはあなたの責任です。 (バインディングを提供するだけの場合は、このメソッドを実装する必要はありません)。
IntentServiceはすべての開始要求が処理された後にサービスを停止するので、stopSelf()
を呼び出す必要はありません。
もし誰かが私にintentServiceを使ってやることはできてもServiceや他の方法ではできないことの例を見せてもらえれば。
定義上、それは不可能です。 IntentService
は、Javaコードで書かれたService
のサブクラスです。したがって、IntentService
が実行できることはすべて、Service
は、IntentService
が使用するコードの関連部分を含めることによって実行できます。
独自のスレッドでサービスを開始することは、IntentServiceを開始することに似ています。そうではありませんか?
IntentService
の3つの主な機能は次のとおりです。
バックグラウンドスレッド
バックグラウンドスレッドでIntent
の自動キューイングがonStartCommand()
に渡されたため、バックグラウンドスレッドで1つのIntent
がonHandleIntent()
によって処理されている場合、他のコマンドは順番を待ってキューに入ります。
キューが空になったら、stopSelf()
の呼び出しを介したIntentService
の自動シャットダウン
Service
を拡張せずにIntentService
によってそれらのすべてを実装することができます。
サービス
startService()
による呼び出しThread
からトリガされますMain Thread
上で実行stopSelf()
またはstopService()
を呼び出してサービスを停止するのは私たちの責任です。IntentService
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つを提供します。このトピックに関するさらに詳しい議論は、ブログの投稿を見てください。
from { Android開発者ガイド :
IntentServiceは、要求に応じて(Intentsとして表現される)非同期要求を処理するサービスの基本クラスです。クライアントはstartService(Intent)呼び出しを介して要求を送信します。サービスは必要に応じて開始され、各インテントを順番にワーカースレッドを使用して処理し、サービスがなくなると自動的に停止します。
IntentServiceで使用されているデザインパターン
注:この「作業待ち行列プロセッサー」パターンは、一般に、アプリケーションのメインスレッドからタスクをオフロードするために使用されます。 IntentServiceクラスは、このパターンを単純化し、仕組みを整えるために存在します。それを使用するには、IntentServiceを拡張してonHandleIntent(Intent)を実装します。 IntentServiceはインテントを受け取り、ワーカースレッドを起動し、必要に応じてサービスを停止します。
すべてのリクエストは単一のワーカースレッド上で処理されます - それらは必要なだけかかるかもしれません(そしてアプリケーションのメインループをブロックすることはありません)が、一度に一つのリクエストだけが処理されるでしょう。
IntentServiceクラスは、単一のバックグラウンドスレッドで操作を実行するためのわかりやすい構造を提供します。これにより、ユーザーインターフェイスの応答性に影響を与えずに長時間の操作を処理できます。また、IntentServiceはほとんどのユーザーインターフェイスライフサイクルイベントの影響を受けないため、AsyncTaskをシャットダウンするような状況でも引き続き実行されます。
IntentServiceにはいくつかの制限があります。
それはあなたのユーザーインターフェースと直接対話することはできません。結果をUIに入れるには、それらをアクティビティに送信する必要があります。作業要求は順次実行されます。操作がIntentServiceで実行されていて、それに別のリクエストを送信した場合、そのリクエストは最初の操作が終了するまで待機します。 IntentServiceで実行されている操作は中断できません。ただし、ほとんどの場合
IntentServiceは単純なバックグラウンド操作に適した方法です。
**
バレーボール図書館
Androidネットワーキングアプリケーションを開発するためのバレーライブラリ と呼ばれるライブラリがあります。_ソースコードはGitHubで一般に公開されています。
バックグラウンドジョブのベストプラクティス のAndroid公式ドキュメント:インテントサービス、スレッド、ハンドラー、サービスに関する理解を深めるのに役立ちます。また、 ネットワーク操作の実行
IntentService
は独自のスレッドで実行されます。それが終わったらそれはそれ自身を止めるでしょう。火のようにもっと忘れて。後続の呼び出しはキューに入れられます。キューイングに適しています。 IntentService
内で必要に応じて複数のスレッドをスピンすることもできます。これはThreadPoolExecutor
を使用して実現できます。これは、多くの人が「なぜIntentService
を使うのは並列実行をサポートしていないのですか」と私に尋ねたからです。 IntentService
は単なるスレッドです。あなたはその中で必要なことは何でもすることができます - 複数のスレッドを回転させることさえ。唯一の注意点は、これらの複数のスレッドをスピンするとIntentService
が終了することです。それらのスレッドが戻ってくるのを待ちません。あなたはこれの世話をする必要があります。だから私はそれらのシナリオでThreadPoolExecutor
を使うことを勧めます。
デフォルトではService
はメインスレッドで実行されます。仕事をするにはワーカースレッドを回す必要があります。明示的にservice
を停止する必要があります。あなたがあなたのアプリから離れてヘッドレスservice
のためにもっと戻って来たとしてもあなたがバックグラウンドでものを実行する必要があるとき私は状況のためにそれを使いました。
必要に応じて、BroadcastReceivers
を使用していつでもあなたの活動に返信することができます。
'Android IntentService vs Service'のようなものを単純に検索することで、さまざまな違いの一覧を見つけることができるはずです。
例ごとのより重要な違いの1つは、IntentServiceが終了すると自動的に終了することです。
いくつかの例(すぐに完成する)があります。
IntentService:アプリの起動時に大量の画像をダウンロードする場合。これは1回限りのプロセスであり、すべてがダウンロードされたらそれ自身をクリーンアップできます。
サービス:アプリとバックエンドの間でWeb API呼び出しを使用して通信するために常に使用されるサービス。現在の作業が終わっても、コミュニケーションをよくするために、数分後に作業を続けたいと思うでしょう。
IntentServiceは、バックグラウンドおよび独立したスレッドで実行する必要があるタスクの実行を容易にするために作成されたServiceの拡張です。
IntentServiceが起動し、スレッドを作成し、そのタスクをスレッド内で実行します。一度実行されると、それはすべてをきれいにします。同時に実行できるIntentServiceのインスタンスは1つだけです。複数の呼び出しがキューに入れられます。
それは使用するのが非常に簡単で、多くの使用のために非常に便利です、例えばものをダウンロードすること。しかし、それはあなたが代わりにもっと基本的な(単純ではない)サービスを使いたくなるような制限を持っています。
たとえば、xmppサーバーに接続され、アクティビティによって制限されているサービスは、IntentServiceを使用して簡単には実行できません。 IntentServiceのものを無視したり、上書きしたりすることになります。
IntentService extends Service classこれは明らかにIntentService
が意図的に same 目的で作られていることを意味します。
だから目的は何ですか?
`IntentServiceの目的は、心配することなくバックグラウンドタスクを実行しやすくすることです。
ワーカースレッドの作成
処理マルチリクエストを1つずつキューに入れる(Threading
)
Service
を破棄するそのため、 _ no _ 、Service
は、IntentService
が行うことになるすべてのタスクを実行できます。要件が上記の基準に該当する場合は、それらのロジックをService
クラスに記述する必要はありません。 IntentService
は発明されたホイールなので、ホイールを再発明しないでください。
IntentServiceが別のスレッドで実行されている間、サービスはUIスレッドで実行されます。
アクティビティの範囲を超えて存在する複数のバックグラウンドタスクを1つずつ実行する場合は、IntentService
が最適です。
IntentService
からService
を作成する方法通常のサービスはUIスレッド上で実行されます(デフォルトでは、すべてのAndroidコンポーネントタイプがUIスレッド上で実行されます(例:Activity
、BroadcastReceiver
、ContentProvider
、およびService
)。あなたが完了するまでに時間がかかるかもしれないいくつかの作業をしなければならないなら、あなたはスレッドを作成しなければなりません。複数のリクエストがある場合は、synchronization
を処理する必要があります。 IntentService
には、あなたに代わってそれらのタスクを実行するデフォルトの実装が与えられています。
開発者ページに従ってください
IntentService
はワーカースレッドを作成します
IntentService
はonHandleIntent()
メソッドにリクエストを一つずつ送信するワークキューを作成します
IntentService
はstopSelf()
メソッドを呼び出します。onBind()
メソッドのデフォルト実装を提供しますIntent
要求をWorkQueueに送信し、最終的にonStartCommand()
に送信するonHandleIntent()
のデフォルト実装誰かが私に
IntentService
を使ってできることとservice
を使ってはできないことの例を私に見せることができればその逆もあります。
IntentService
はロングタイムリスニングには使用できません。XMPPリスナーはその単一のタイムオペレータであり、仕事をしてさよならを振るいます。
また、スレッドワーカーは1人だけですが、トリックがあれば無制限に使用できます。
Service
とIntentService
の主な違いは以下の通りです。
サービス:
1.デフォルトではService
がアプリケーションのメインスレッドで実行されます(ここではデフォルトのワーカースレッドは使用できません)。ユーザーは別のスレッドを作成し、そのスレッドで必要な作業を行う必要があります。
2.一度に複数のリクエストを許可する(マルチスレッド)
IntentService:
1.さて、IntentService
に来て、ここでデフォルトのワーカースレッドがどんな操作を実行するのにでも利用可能です。 注意してください - あなたはバックグラウンドの仕事をすることができるそれぞれの開始要求の意図を受け取るonHandleIntent()
メソッドを実装する必要があります。
2.ただし、一度に1つの要求しか許可しません。