確かではありませんが、私の知識によれば、私の見解を共有します。私が間違っている場合、私は常にベストアンサーを受け入れます。
アラームマネージャー
アラームマネージャーは、アラームレシーバーのonReceive()
メソッドが実行されている限り、CPUウェイクロックを保持します。これにより、ブロードキャストの処理が完了するまで電話がスリープしないことが保証されます。いったんonReceive()
戻って、アラームマネージャは、このウェイクロックを解除します。つまり、onReceive()
メソッドが完了するとすぐに電話がスリープする場合があります。アラームレシーバーがを呼び出した場合Context.startService()
、要求されたサービスが開始される前に電話がスリープ状態になる可能性があります。これを防ぐには、BroadcastReceiver
とService
が別個のウェイクロックポリシーを実装して、サービスが利用可能になるまで電話が引き続き実行されるようにする必要があります。
注:アラームマネージャーは、アプリケーションが現在実行されていなくても、特定の時間にアプリケーションコードを実行させたい場合を対象としています。通常のタイミング操作(ティック、タイムアウトなど)では、ハンドラーを使用する方が簡単で効率的です。
タイマー
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
synchronized public void run() {
\\ here your todo;
}
}}, TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1));
Timer
にはいくつかの欠点がありScheduledThreadPoolExecutor
ます。だから、それは最良の選択ではありません
ScheduledThreadPoolExecutor。
java.util.Timer
またはScheduledThreadPoolExecutor
(推奨)を使用して、バックグラウンドスレッドで定期的な間隔でアクションが発生するようにスケジュールできます。
後者を使用したサンプルを次に示します。
ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate
(new Runnable() {
public void run() {
// call service
}
}, 0, 10, TimeUnit.MINUTES);
だから私は好んだ ScheduledExecutorService
ただし、アプリケーションの実行中に更新が発生する場合はTimer
、他の回答で提案されているように、またはより新しいを使用できることも考慮してくださいScheduledThreadPoolExecutor
。アプリケーションが実行されていなくても更新される場合は、を使用する必要がありAlarmManager
ます。
アラームマネージャーは、アプリケーションが現在実行されていなくても、特定の時間にアプリケーションコードを実行させたい場合を対象としています。
アプリケーションがオフになっているときに更新を計画している場合は、10分に1回が非常に頻繁であり、電力消費が少なすぎることに注意してください。