web-dev-qa-db-ja.com

Androidでスレッド/サービスを使用するのはいつですか?

スレッドまたはサービスはいつ使用する必要がありますか?

それらは認証に使用されるべきですか?たとえば、私のアプリでは、スレッドまたはサービスの使用を検討していました(Active Directoryを介して認証しています)。

それぞれがいつ使用されるかの例はありますか?

29
Cody

スレッドは、UIの更新をブロックする長時間実行プロセスで使用する必要があります。 1〜2秒以上の場合は、バックグラウンドスレッドに入れて、ダイアログやスピナーなどでユーザーに通知することをお勧めします。 UIスレッドを5秒以上ロックすると、OSから「強制終了または待機」オプションが表示されます。

サービスは別のスレッドで実行されないため、UIはブロックされますが、サービス内に新しいスレッドを生成できます。サービスは、一定の間隔で発生する必要があるもの、またはUIが表示されていないときに何かを実行/チェックし続けるために、より多く使用されます。

26
Patrick Kafka

更新:Androidのドキュメントには、対応する説明が含まれているようです。 http://developer.Androidを参照してください。 com/reference/Android/app/Service.html#WhatIsAService

元の回答:

Androidでは、Serviceは同時実行(「バックグラウンドで実行」)を提供しません。実際には、newを介したアプリケーションではなく、Javaシステムを介してインスタンス化(および管理)されるだけの単純なAndroidオブジェクトです。

したがって、サービスの最も重要な特性は、ワークロードの延期に関するものではありません。これは単純なスレッドで実現できます。

サービスオブジェクトを特別なものにしているのは、それがAndroidシステムに登録されていることですサービスとして。これにより、このオブジェクトが何らかのサービスを提供し、should可能な限り、または停止するまで存続することがシステムに通知されます。通常のアプリケーションスレッドは、Androidシステムにとってこの特別な意味を持たず、システムの裁量ではるかに寛大に終了します。

したがって、アプリケーション/ Activityがアクティブな間だけ実行するためにいくつかのバックグラウンドアクティビティが必要な場合、スレッドは必要なことを実行できます。

そのコンポーネントが必要な場合 アクティブに保つ しばらくして、AndroidシステムがActivitiesをメモリから削除することを決定した場合でも、パージされません。サービス、または「フォアグラウンドサービス」に移動する必要があります。システムであり、リソースを再利用するために終了する可能性はさらに低くなります。

もちろん、必要に応じて、Serviceオブジェクトに1つ以上のThreadインスタンスを含めることもできます。これらのインスタンスは、Serviceオブジェクト自体と同じ長さで存続できます。

編集:

ああ、それに加えて:もちろん、サービスは、他のアプリケーションにサービスを提供したい場合にの方法です。サービスのみにバインド」します。

47
JimmyB
4
user370305

他のアプリケーションで使用されているもの、またはアプリケーションアクティビティよりも長生きするものが必要な場合は、サービスを使用してください。サービスの良い例は、時間がかかる可能性があり、この時間中にユーザーにアプリケーションの使用を強制したくないファイル転送です。それ以外の場合は、スレッドを(通常はAsyncTaskなどを介して)使用します。

認証の目的では、AsyncTaskは良い選択のようです。

3
Alex Gitelman

Android開発者ガイド( http://developer.Android.com/guide/components/services.html#Basics ):

サービスは、ユーザーがアプリケーションを操作していないときでもバックグラウンドで実行できる単なるコンポーネントです。したがって、それが必要な場合にのみサービスを作成する必要があります。

メインスレッドの外部で作業を実行する必要があるが、ユーザーがアプリケーションを操作しているときにのみ実行する必要がある場合は、代わりにサービスではなく新しいスレッドを作成する必要があります。たとえば、音楽を再生したいが、アクティビティの実行中にのみ、onCreate()でスレッドを作成し、onStart()で実行を開始してから、onStop()で停止することができます。また、従来のThreadクラスの代わりに、AsyncTaskまたはHandlerThreadの使用を検討してください。スレッドの詳細については、プロセスとスレッドのドキュメントを参照してください。

サービスを使用する場合でも、デフォルトではアプリケーションのメインスレッドで実行されるため、集中的な操作やブロック操作を実行する場合は、サービス内に新しいスレッドを作成する必要があります。

1
Rikin Prajapati

主な違いはAndroidシステムの態度です。サービスはAndroidインフラストラクチャの一部なので、Androidはサービスを認識しますアプリケーションの動作部分として、最後のオプションとしてサービスの強制終了を検討します。さらに、フォアグラウンドアクティビティと同じくらい重要にするために、サービスの優先度を調整できます。スレッドに関しては、Androidスレッドを保持する必要のある重要な部分として認識します。したがって、通常のスレッドは、強制終了される可能性がはるかに高くなります。

たとえば、動作中のスレッドを開始してからバックグラウンドに移行するアクティビティがある場合、Androidはスレッドを動作中の部分として認識しないため、アクティビティやサービスがないため、アプリケーションは何もしないと考える可能性があります作業スレッドを含むアプリ全体を実行して強制終了します。

1
mc.dev