web-dev-qa-db-ja.com

androidの同じスレッドで実行する場合、Serviceを使用する理由

バウンドサービス in Android開発者のウェブサイト。サービスを十分に理解していると思いましたが、使用してサービスを接続する別の方法を見つけました Messenger 特にローカルサービスのクラス。そこで混乱し、コンセプトが間違っているかもしれません。

Android Service 。の私の理解は次のとおりです。

  1. backgroundで個別のジョブを実行します。
  2. 別のプロセスにする必要があります。
  3. 起動したコンポーネントから独立したライフサイクルで実行する必要があります。

混乱はリストの最初の項目であり、背景の定義です。バックグラウンドはスレッドまたはプロセスではありませんか?メインスレッドで実行できるとは思っていませんでした。

開発ページのサービスに関する注意事項は次のとおりです。

Caution:サービスはホスティングプロセスのメインスレッドで実行されます。サービスは独自のスレッドを作成せず、別のプロセスで実行されません(ただし、別に指定します)。つまり、サービスでCPUを集中的に使用する作業やブロッキング操作(MP3再生やネットワークなど)を行う場合、その作業を行うにはサービス内に新しいスレッドを作成する必要があります。個別のスレッドを使用することにより、アプリケーションが応答しない(ANR)エラーのリスクを軽減し、アプリケーションのメインスレッドをユーザーのアクティビティとの対話専用にすることができます。

ご質問

  1. とにかくメインスレッドでサービス機能が実行されるのに、なぜサービスを選択するのですか?
  2. 時間のかかるジョブがメインスレッドで実行された場合でも、ANRをブロックするためだけにサービスを記述する必要がありますか?サービスは私のアプリケーション専用であると想定します。
  3. サービスをプライベートとして使用し、同じスレッドで実行する実用的なケースや理由はありますか?
29
Jaekwan

アプリケーションのメインスレッドは、常にUIスレッドではありません。たとえば、Activityが停止すると、onStop()が呼び出されるため、UIスレッドはそのActivityから削除され、同じまたは別のアクティビティ内に移動します。応用。ただし、アプリケーションがアクティブでなくなるわけではなく、OSまたはユーザーによって閉じられるまでバックグラウンドで動作し続けることができます。次に、誰がバックグラウンドで実行し続けますか?これはメインスレッドであり、UIスレッドではありません。

サービスとは

Androidでは、サービスはUIスレッドのバックグラウンドで長時間実行される操作を実行できるアプリケーションコンポーネントです。バックグラウンドでは、ユーザーインターフェースがないことを意味します。サービスはデフォルトで呼び出し側コンポーネントのプロセスのメインスレッドで実行されるため(応答性が低下し、ANRが発生する可能性があります)、新しいスレッドを作成して長時間実行する必要があります。サービスを完全に異なるプロセスで実行することもできます。

アクティビティコンポーネントとは異なり、サービスにはグラフィカルインターフェイスがありません。また、ブロードキャストレシーバーはブロードキャストメッセージ(ブロードキャスト、マルチキャスト、ユニキャスト)を受信し、短いタスクを実行しますが、サービスは音楽のストリーミング、ネットワークトランザクション、ファイルI/O、データベースとの対話などの長時間の処理を行うことを目的としています。アクティビティなどのアプリケーションコンポーネントによってバックグラウンドで実行され、ユーザーが別のアプリケーションに切り替えたり、開始コンポーネント自体が破棄されても実行され続けます

サービスを使用する理由

サービスには他のバックグラウンドプロセスよりも高い優先順位が与えられているため、Androidがサービスを終了する可能性は低くなります。十分なリソースが再び利用可能になったら再起動するように設定できますフォアグラウンドアクティビティと同じ優先度を割り当てることは間違いなく可能です。その場合、目に見える通知をアクティブにする必要があります(通常、音楽を再生するサービスで使用されます)。

自分でスレッドを管理したくない場合は、IntentServiceを使用します。それ以外の場合は、AsyncTasksを使用します。

詳細を理解する および この回答を読む にこの優れた記事をお読みください。

33
Samvid Kulkarni