2012-05-08 13 views
0

サービスを実行する非常に簡単なAndroid GPSロギングアプリがあります。アクティビティは、サービスを制御するための開始/停止ボタンに過ぎません。ボタンをクリックすると、新しい背景サービス(START_STICKY)が開始されます。それから私はアクティビティを閉じ、サービスは正常に実行されます。私は再びサービスを停止するためにアプリを実行することができます。私のAndroidサービスが突然停止し、新しいサービスが作成されました

サービスは、単にGPS座標をファイルに記録します。私はすべてのメソッドとException catchでロギングしています。ある時点で、数分または数時間かかることがありますが、サービスは停止しますが、onDestroyは呼び出されず、例外もスローされません。ログには、最後に書き込まれたファイルが表示され、その後は何も表示されません。私はGCがそれを殺していると思われますが、私はSTART_STICKYは基本的に "できるだけ長く実行してください"と考えていました。 30秒後にサービスの新しいコピーが開始され(異なるPID)、onCreateとonStartServiceは通常どおり呼び出されます。

Androidの親のアクティビティやアプリケーションを強制終了すると、Androidはサービスを終了しますか?これを防ぐには、別のスレッドでサービスを実行する必要がありますか?完全なサービスのライフサイクルが完了しないのはなぜですか(onDestroyは呼び出されません)。

答えて

0

サービスは実際にはメインスレッドで実行されており、作業を行う場合は時間がかかる可能性があります。新しいスレッドを作成する必要があります。通常のサービスの代わりにIntentServiceを使用すると、Androidでこれを行うことができます。

私は、Androidがメインスレッドを占有するプロセスを5つ以上(?)削除することを追加する必要があります。メインスレッドをロックすると、ANR(Application Not Responding)が発生し、これがあなたのサービスで経験したことかもしれません。

0

Androidは、親アクティビティが閉じられてもバックグラウンドサービスを終了しません。しかし、デバイス画面がロックされていると、バックグラウンドジョブが中断されます。あなたの問題はこれに関連しているかもしれません。画面が再びロック解除されると、サービスはその作業が終了した場所から作業を続けることが期待されます。

+0

画面がロックされているとサービスが正常に動作するため、問題はないと思います。私が知る限り、サービスは一時停止も再開もしません –

関連する問題