2016-08-13 7 views
2

私の主な活動でonCreateにサービスが呼び出されました。 サービスはサービスクラス(IntentServiceではなく)から拡張されています - スレッドが呼び出され、無限ループを持ちます - スレッドが例外をスローした場合、サービスを閉じてサービスを呼び出します(try catchブロック)。サービスがアンドロイドによって閉じられた後、スレッドは引き続き実行されますか?

最終的には、何らかの理由でサービスがアンドロイドによって閉じられます。

次の質問にお答えください。

A)スレッドは引き続き実行されますか?

.....もしそうなら、いつでも例外がスローされますが、それはサービスを呼び出しますか?

....そうでない場合は、サービスが再び開始されるように例外がスローされますか?

B)私のサービスをオフにすると、アンドロイドは私のスレッドをちょうど回しますか?

私は、Androidがサービスをクリアすることを決定したときに、アプリケーションに何が起こるかを理解しようとしています。

答えて

1

スレッドが実行されている限り、「ガベージコレクションルート」とみなされます。したがって、スレッド自体およびそのスレッドから到達可能な他のオブジェクトは、ガベージコレクトされません。 Androidフレームワークが干渉しない場合、無限ループを持つスレッドは無期限に実行され続けます。スレッドはサービスを「閉じる」ことができるので、サービスへの参照(暗黙的または明示的)があると仮定します。したがって、サービス全体がメモリに残ります。

しかし、Androidにはアプリのメモリ消費を監視する手段があり、メモリを解放するためにアプリを強制終了できます。 Androidがアプリを殺すと、アプリのプロセス全体が終了します。プロセスが強制終了されると、すべてのスレッドが停止し、それらに関連付けられたメモリが解放されるため、それ以上のアクティビティは発生しません。

これはサービスの終わりのようですが、Androidはその場合の処理​​を制御するための追加メカニズムを提供しています.STICKYとしてサービスを指定でき、Androidはできるだけ早くサービスを再開しようとします。それはthis answerで詳細に議論されています。

参考文献:

がこの回答に記載されている情報のほとんどはofficial Services pagejavadoc of service classで覆われています。

Serviceの別のプロセスで実行されているより複雑なシナリオの場合、ドキュメントはほとんどありませんが、そこには多くのブログがあります。私はまた、件名に投稿を投稿しました:How to establish a reliable (crash and kill tolerant) connection to bound IPC (e.g. AIDL) Service in Android

+0

ワウありがとう、これは私が知りたかったものです。これが文書化されている場所を尋ねてもいいですか?あなたが間違っていると思うわけではありませんが、私はたくさんの質問をしています。それを自分自身で調べる方が簡単でしょう:P – AndroidStudent

+0

@AndroidStudent、よろしくお願いします。私は答えの最後にいくつかの参考文献を追加しました – Vasiliy

+0

非常にありがとう - 非常に有用:) – AndroidStudent

関連する問題