확실하지는 않지만 내 지식에 따라 내 의견을 공유합니다. 내가 틀렸다면 항상 최선의 대답을 받아들입니다.
알람 관리자
알람 관리자는 알람 수신기의 onReceive()
방법이 실행 되는 동안 CPU wake lock을 유지합니다 . 이렇게하면 방송 처리를 마칠 때까지 전화기가 잠들지 않습니다. 일단 onReceive()
반환, 알람 Manager는이 웨이크 잠금을 해제합니다. 이것은 경우에 따라 onReceive()
방법이 완료 되는 즉시 전화기가 절전 모드로 전환됨을 의미합니다 . 알람 수신기가를 호출 Context.startService()
하면 요청한 서비스가 시작되기 전에 전화기가 절전 모드로 전환 될 수 있습니다. 이를 방지하려면 BroadcastReceiver
및 Service
서비스를 사용할 수있을 때까지 전화가 계속 실행되도록하기 위해 별도의 웨이크 잠금 정책을 구현해야합니다.
참고 : 알람 관리자는 애플리케이션이 현재 실행되고 있지 않더라도 특정 시간에 애플리케이션 코드를 실행하려는 경우를위한 것입니다. 정상적인 타이밍 작업 (틱, 타임 아웃 등)의 경우 Handler를 사용하는 것이 더 쉽고 효율적입니다.
시간제 노동자
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 분마다 한 번 씩은 매우 자주 발생하므로 전력을 너무 많이 소비 할 수 있습니다.