2

状況:

注:これは、アクティビティ/サービス間のハンドラー/メッセージ通信をセットアップする方法を処理する前の質問のフォローアップです。参照:リンク

アクティビティは、バインドを使用して開始されたサービスに接続します。アクティビティは、サービス Handler への参照を使用してローカル バインダーを取得します。Activity と Service は、お互いの Handler を介して Message オブジェクトを交換します。ユーザーがアプリの使用を終了すると、ユーザーは開始したサービスを終了する (サービスをシャットダウンする) ようにサービスに通知します。サービス (=mainThread) 内で別のスレッド、serviceThread が実行されています。serviceThread は、serviceThread によって完全に制御され、より多くのサブスレッドを実行できます。通信は、サービスの mainThread を通じてではなく、アクティビティと serviceThread の間で処理されます!!!

問題:

サービス内で複数のスレッドが際限なく実行されているときに、サービスを正常にシャットダウンするにはどうすればよいですか (「荷物をまとめて、家に帰りましょう!」というメッセージが表示されるまで、別名: EXIT_SERVICE.

ソリューション候補:

  • シナリオ 1: アクティビティ側から、(mainThread ではなく) サービス内で実行されている serviceThread に EXIT_SERVICE メッセージを送信します。serviceThread のすべてのサブスレッドがクリーンアップ/停止されたら、サービスを実際に停止する stopService(Intent) メソッドを安全に呼び出すことができるようになったことを示すメッセージをアクティビティに送り返します。アクティビティは finish() を呼び出すことができるようになり、アプリは正常に終了します。

  • シナリオ 2: アクティビティ側から、すべてのサブスレッドをクリーンアップする serviceThread に EXIT_SERVICE メッセージを送信します。その後、serviceThread は、サービスを完全にシャットダウンするというメッセージをアクティビティに送信し、そのメッセージが送信された後、サービスの mainThread ハンドラーにメッセージを送信して、サービスを実際にシャットダウンします。サービスはシャットダウン メッセージを受信し、変数をクリーンアップして stopSelf(int) を呼び出します。サービスは停止され、アクティビティは stopService(Intent) を呼び出さずに停止できることを認識しています! アプリは正常に終了します。

  • シナリオ 3: アクティビティ側から stopService(Intent) メソッドを呼び出します。このメソッドは、Intent をサービスに配信してサービスを停止します。サービスでは、サービスを停止する実際のサービス コードが実行される前に、この Intent がインターセプトされます (これが可能かどうか、またその方法はまだわかりません... しかし、これが可能であると仮定します)。サービスが実際に停止する前に、他のコードが最初に実行され、EXIT_SERVICE メッセージを serviceThread に送信してスレッドをクリーンアップします。serviceThread がクリーンアップされた後、メッセージが mainThread (サービス自体) に送り返され、コードは、サービスを停止する意図が傍受されなかったときに通常実行された通常のコードを実行し続けます。アプリは正常に終了します。

そのため、サービスを正常に停止する方法には 3 つのオプションがあります。問題は、どのシナリオが「最適」かということです (エラーが発生しにくく、シャットダウンが最も速く、実装が最も簡単です)。たとえば、「サービス停止」メッセージまたはインテントが送信された瞬間にユーザーが縦向き/横向きモードを切り替えたためにアクティビティが破棄された場合はどうなりますか?

シナリオ 3 は良い解決策だと思います。なぜなら、Activiy 側で多くの余分なコーディングを必要とせず、stopService(Intent) と finish() だけだからです。GUI が既になくなっている間に、サービスが停止中の場合もあります。唯一の問題は、停止インテントを傍受し、その信号に基づいて行動する方法です。

あなたの考えを共有してください....

4

0 に答える 0