よくわかりませんが、私の知識によれば、私は自分の意見を共有しています。私が間違っている場合、私は常にベストアンサーを受け入れます。
アラームマネージャー
onReceive()
アラームマネージャは、アラーム受信機のメソッドが実行されている限り、CPUウェイクロックを保持します。これにより、ブロードキャストの処理が終了するまで電話がスリープしないことが保証されます。onReceive()
戻ると、AlarmManagerはこのウェイクロックを解除します。onReceive()
これは、メソッドが完了するとすぐに電話がスリープする場合があることを意味します。アラーム受信機がと呼ばれる場合Context.startService()
、要求されたサービスが開始される前に電話がスリープする可能性があります。これを防ぐには、サービスが利用可能になるまで電話が引き続き実行されるように、別のウェイクロックポリシーを実装する必要がありますBroadcastReceiver
。Service
注:Alarm Managerは、アプリケーションが現在実行されていない場合でも、特定の時間にアプリケーションコードを実行する場合を対象としています。通常のタイミング操作(ティック、タイムアウトなど)の場合、ハンドラーを使用する方が簡単で効率的です。
タイマー
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回の頻度が非常に高いため、消費電力が少なすぎる可能性があることに注意してください。