長時間実行されるタスクのアプリで Android サービスを使用する代わりにスレッドを使用することの短所は何ですか。長時間実行されるタスクに Android サービスを使用しないとどうなりますか?
5 に答える
サービス:
サービスは、runs in the background, without direct interaction with the user
. このサービスにはユーザー インターフェイスがないため、not bound to the lifecycle of an activity
.
Services are used for repetitive and potential long running operations
、インターネット ダウンロード、新しいデータのチェック、データ処理、コンテンツ プロバイダーの更新など。
サービスにフォアグラウンド アクティビティと同じ優先度を割り当てることができます。この場合、関連するサービスの可視通知をアクティブにする必要があります。動画や音楽を再生するサービスでよく使われます。
スレッド:
それらは単純な実行可能なスレッドです。これらのスレッドで UI 以外のものを実行できますが、UI タスクを実行することはできません (UI はスレッドセーフではないため)。これらのスレッドで UI を処理するにはHandlers
、 を使用する必要があります。これは、初心者がそれらを把握して理解するのが非常に面倒です。
そのため、ニーズとアプリに応じて、最適なものを選択できます。
サービスは、バックグラウンドで実行時間の長い操作を実行できるアプリケーション コンポーネントであり、ユーザー インターフェイスは提供しません。別のアプリケーション コンポーネントがサービスを開始でき、ユーザーが別のアプリケーションに切り替えた場合でも、サービスはバックグラウンドで実行され続けます。さらに、コンポーネントはサービスにバインドして対話し、プロセス間通信 (IPC) を実行することもできます。たとえば、サービスはネットワーク トランザクションの処理、音楽の再生、ファイル I/O の実行、またはコンテンツ プロバイダーとのやり取りをすべてバックグラウンドで行う場合があります。
一方、スレッドはマルチタスク オペレーティング システムの基礎であり、メイン プロセス内で実行されるミニプロセスと考えることができます。その目的は、アプリケーション内で少なくとも並列実行パスを出現させることです。
これらは要件に応じて使用する必要があり、どちらもさまざまな状況で不可欠であるため、どちらの長所と短所を実際に指摘することはできません.
長時間実行されるタスクに Android サービスを使用しないとどうなりますか?
運が良ければ、コードが完成します。繰り返しますが、運が悪く、コードがランダムな時点で殺される可能性があります。
Service
Androidとは何か、そしてAndroidとは何かという教科書の説明はThread
別として、あなたの質問に直接関係する2つの主な違いは、OSがそれらをどのように脅かすかです。
スレッドはバックグラウンドでコードを実行する方法であり、サービスはバックグラウンドでコードを実行していることを Android に認識させる方法です。
基盤となる Linux カーネルに関する限り、それはスレッドについてのみ認識しており、スレッドの切り替えと優先順位付けに関してのみそれらを考慮します。サービスの有無はこれに影響しません。
ただし、Android デバイスのメモリ管理とタスクの優先順位付けに関する限り、Android はプロセス内のスレッドを認識したり気にしたりしません。サービスについてのみ認識し、メインのアプリ プロセス スレッドでのみサービスと対話します。
したがって、スレッドが生きている限り、カーネルは喜んでプロセスを存続させ、そのスレッドの実行に CPU 時間を割り当てようとします。
ただし、アクティビティ、サービス、コンテンツ プロバイダー、またはブロードキャスト レシーバーが生きている場合を除き、この時点でどのスレッドが動作していても、Android メモリ マネージャーはプロセスを強制終了して、別の優先度の高いプロセスのためにリソースを再利用することを決定する可能性があります。
したがって、ユーザーがアクティビティと対話している場合は別のスレッドで実行することをやめることができますが、バックグラウンド タスクが正常に終了し、ランダムな時点で中断されないようにする場合は、それをラップする必要がありますサービス (できれば、アクティビティにバインドされているか、通知を表示することで UI 優先度に昇格されているサービス)。
サービスを使用しても、そのコードがバックグラウンドで実行されるとは限らないことに注意してください。Android は、アプリケーション プロセスのメイン スレッドでライフサイクル メソッド (onStartCommand/onBind/onCreate/OnDestroy) を呼び出します。真のバックグラウンド実行を保証するには、コードでスレッドを開始する必要があります。
約 90 時間、非同期タスクでアルゴリズムを実行しました。うまくいきました。
非同期タスク: ダウンロードなどの「重い」タスクを UI から分離します。 サービス: 目覚まし時計など、アプリからタスクを分離します。