2013-07-25 16 views
7

私はバックグラウンドで長時間実行する必要のあるサービスを持っています。フォアグラウンドサービスは、通知のために適切ではありません。ポーリングをしている間は、静かに実行する必要があります。これはすでにこれを行い、必要なように動作します。これは私の問題ではない、これはちょっとした背景だ。OSで殺されるAndroidサービスを正常に処理するにはどうすればよいですか?

サービスがユーザーによって強制終了され、onDestroy()が呼び出されると、データはdbに保存されます。問題はありません。また、電話がオフになっている私はスクリーンオフ/リッスンを聞く放送受信者があります。ここでも問題はありません。

問題は、メモリが不足してOSがサービスを終了したときです。サービスが殺され、onDestroy()が呼び出されたとは思わない。そうであれば、私のデータは保存されません。したがって、サービスが強制終了されてしばらく実行されている場合、収集したすべての情報は失われます。

それでは、私の質問は次のとおりです。リソースを正常にクリーンアップしてデータを保存するにはどうすればよいですか?システムがサービスを停止する前にデータを保存するためのコードを実行する方法はありますか? データ損失の量を減らすために、数分の間隔でデータベースにサービスを保存することを検討しました。これはパフォーマンスが賢明でどれくらい良いのか分かりません。クエリは、例えば5分の期間に30行までしか挿入しない可能性があります。おそらく少ない。

私はAndroid開発に比較的新しいので、ここで質問をする前にこの問題を調べるように最善を尽くしました。私が何かを見過ごした場合にはお詫び申し上げます。

ありがとうございます!

+0

onDestroyを呼び出して、そこでデータを保持する必要があります。サービスが再開されたら、agaibをロードしてください。 –

+0

リソースが少ないためにシステムがサービスを終了するときに、onDestroy()が呼び出されません。 @BLaZuRE - あなたがリンクしたドキュメントはアクティビティのためのものです。私が間違っているが、サービスにonPause()メソッドがない場合は、私を修正してください。 –

答えて

3

サービスがosによって強制終了された場合、このイベントではコードは実行されない可能性があるため、変更後のデータを保存する必要があります。

実際には、onStartCommand()のService.START_STICKY_COMPATIBILITYを返すとバック​​グラウンドサービスが再開されますが、これはデフォルトの選択であり、気にする必要はありません。サービスを迅速に初期化し、できるだけ早く結果を保存してください。

+0

データを一定間隔で保存することをお勧めしますか? 2分か何か言いますか? –

+0

データの変更を監視できない場合は、定期的にデータを保存してください。 – faylon

+0

私はデータの変更を保存することができます。私はこれが頻繁にデータベースにアクセスするのが悪い習慣とみなされているかどうかは分かりませんでした。しかし、ありがとう、私はあなたの答えを受け入れるでしょう。 –

関連する問題