2

現在、私は 2 つのセクションでセットアップされたアプリを持っています。アクティビティ部分はタスクとタスクの完了時間をデータベースに追加し、バックグラウンドで実行されてデータベースをポーリングし、タスクの完了時間に達したときにタスクを処理するサービスを持っています。

現在、私のサービスはスレッドを拡張するプライベート内部クラスを使用しており、thread.sleep を使用してタスク処理メソッドを再実行しています。この内部クラスは、サービス クラスの onStartCommand() から呼び出されます。thread.sleep が 15 分に設定されているか、それ以前にタスクを処理する必要がある場合は、このタスクを処理する必要がある時間までスリープします。この時点で、すべてが正しく機能していますが、いくつかの問題が発生しています。

  1. サービスは特定の時間に実行する必要があり、電話がスリープ状態になっても、タスクをいつ完了する必要があるかによって常に変化します。

  2. バッテリーへの影響を最小限に抑える必要があります。

調査の結果、アラームマネージャーを使用すると、必要なときにのみこのサービスを開始できることがわかりました。これは素晴らしいことですが、特定のタスクをいつ処理する必要があるかに基づいて時間間隔を常に変更するためです。これが正しい行動であることは確かです。

また、絶対に必要でない限り使用したくないウェイクロックについても読みました。

アプリでサービスを構築する方法と、これらのタスクをどのように処理するかについて、多かれ少なかれアドバイスを求めています。

4

1 に答える 1

1

調査の結果、アラームマネージャーを使用すると、必要なときにだけこのサービスを開始できることがわかりました。これはすばらしいことですが、特定のタスクをいつ処理する必要があるかに基づいて時間間隔を絶えず変更するため、私はそうではありません。これが正しい行動方針であることを確認してください。

AlarmManager間違いなく正しい解決策です。サービスを常に稼働させ続けること、主に時計の刻みを監視することは、恥ずかしいほどRAMを浪費します。

次のタスクが発生するたびに設定されるアラームイベントは1つしかないため、「時間間隔を絶えず変更する」ことはありません。これは、繰り返し発生するアラームではなく、1回限りのアラームになります。イベントが発生すると、作業に加えて、次のイベントをスケジュールします。唯一のエッジケースは、ユーザーが以前の最も早いタスクよりも早く完了するタスクを追加した場合です。その場合、そのアラームイベントをキャンセルして再スケジュールする必要があります。

どうしても必要な場合を除いて、本当に使用したくないウェイクロックについても読んだことがあります。

AlarmManager定期的な作業を中断することなく確実に実行できるようにする場合は、現在の実装または実装で選択することはできません。WakeLock目標は、実際の作業パルス中にのみアクティブにし、WakeLockその作業パルスが完了したときにサービスを解放してシャットダウンすることです。このパターンの実装はで確認できますWakefulIntentService

于 2013-01-02T21:35:15.450 に答える