Service クラスの目的は何ですか?
Bluetooth Low Energy の多くの例では、すべての Bluetooth 通信、接続、切断、デバイスのスキャンなどにサービス クラスを使用します。アクティビティ クラスは、常にこのサービス クラスからメソッドを呼び出します。
代わりに、Activity クラスですべての Bluetooth 通信を直接実装するのはどうですか? なぜ誰もそのように実装せず、代わりに Service クラスを使用しないのですか?
Service クラスの目的は何ですか?
Bluetooth Low Energy の多くの例では、すべての Bluetooth 通信、接続、切断、デバイスのスキャンなどにサービス クラスを使用します。アクティビティ クラスは、常にこのサービス クラスからメソッドを呼び出します。
代わりに、Activity クラスですべての Bluetooth 通信を直接実装するのはどうですか? なぜ誰もそのように実装せず、代わりに Service クラスを使用しないのですか?
ドキュメントから:
サービスは、バックグラウンドで実行時間の長い操作を実行できるアプリケーション コンポーネントであり、ユーザー インターフェイスは提供しません。別のアプリケーション コンポーネントがサービスを開始でき、ユーザーが別のアプリケーションに切り替えた場合でも、サービスはバックグラウンドで実行され続けます。さらに、コンポーネントはサービスにバインドして対話し、プロセス間通信 (IPC) を実行することもできます。たとえば、サービスはネットワーク トランザクションの処理、音楽の再生、ファイル I/O の実行、またはコンテンツ プロバイダーとのやり取りをすべてバックグラウンドで行う場合があります。
基本的に、アクティビティのライフサイクルから独立した疎結合コンポーネントです。問題は、アクティビティがいつ作成/破棄されるかを実際に制御できない Android にあるため、たとえば、アクティビティに何かをロードしているときに呼び出しを受け取ると、アクティビティが破棄され、更新の結果が次のようになる可能性があります。失われたり、最悪の場合、読み込みタスクが終了せず、アクティビティが保持され、ガベージ コレクションが実行されず、メモリ リークが発生します。
そのため、長時間実行されるバックグラウンド タスクには service を使用しますが、メモリ リークを回避し、リソースに配慮するために、必要な限りそれらを実行させます。
注意: システム リソースの浪費やバッテリー電力の消費を避けるために、アプリケーションが動作を終了したらサービスを停止することが重要です。必要に応じて、他のコンポーネントは stopService() を呼び出してサービスを停止できます。サービスのバインドを有効にしても、onStartCommand() への呼び出しを受け取った場合は、常に自分でサービスを停止する必要があります。
代わりに、すべての Bluetooth 通信を Activity クラスに直接実装するのはどうでしょうか。
UIスレッドでやりすぎたためにフレームワークによって強制終了される可能性が最も高いです(別名ANR - アプリケーションが応答しません)。開発者サイトの Keeping Your App Responsive記事を参照してください。
UI に直接関係のないもの (あらゆる種類のネットワークなど) は、別のタスクにオフロードする必要があります。それはAsyncTaskです:
このクラスを使用すると、スレッドやハンドラーを操作することなく、バックグラウンド操作を実行し、UI スレッドで結果を公開できます。
またはIntentService :
IntentService は、オンデマンドで非同期要求 (インテントとして表現) を処理するサービスの基本クラスです。
. Service (IntentService ではない) は、少し異なる目的のためのものです。
Service は、ユーザーと対話せずに実行時間の長い操作を実行したい、または他のアプリケーションが使用する機能を提供したいというアプリケーションの要求を表すアプリケーション コンポーネントです。
アクティビティ クラスは、あらゆる種類のコミュニケーション タスクに適した場所ではありません。ユーザーが別のアクティビティに切り替えるとすぐに強制終了できます。UI が表示されます。つまり、Activity のスレッドでは多くの作業を行うことができません。時々、次のようなものを使用できます
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// do something here
}
});
t.start();
または AsyncTask でより複雑なことを行いますが、これは短時間のアクションに適しています。
サービスがすぐに終了することはないので、あらゆる種類のバックグラウンド作業に適しています。サービスに関する Android ドキュメントをお読みください。
サービス クラスは、オーディオ ファイルの再生などのバックグラウンドで非 UI 操作を実行するために使用されます。さらにサービスは、アクティビティが破棄された場合でもバックグラウンドで実行されるコンポーネントです。 .