0

サービスを実行する非常に単純な Android GPS ログ アプリがあります。アクティビティは、サービスを制御するための開始/停止ボタンに他なりません。ボタンをクリックすると、新しいバックグラウンド サービスが開始されます (START_STICKY を使用)。次に、アクティビティを閉じると、サービスが正常に実行されます。アプリを再度実行してサービスを停止できます。

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

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

4

2 に答える 2

0

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

于 2012-05-08T21:22:59.537 に答える
0

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

Android はメイン スレッドを 5 (?) 秒以上占有しているプロセスを強制終了することを付け加えておきます。メイン スレッドをロックすると ANR (Application Not Responding) が発生し、サービスでこれが発生する可能性があります。

于 2012-05-08T21:12:41.620 に答える