2012-12-28 3 views
1

기본적으로 새로운 URL을 폴링하여 내 앱에서 백그라운드 확인을해야합니다. 그래서 저는 이것을 읽었습니다. 이것은 AlarmManager로 수행되었습니다.Android : 배터리 방전없이 AlarmManager를 사용하는 올바른 방법

새 물건이 도착하자마자 사용자에게 알림을 보내지 않아도됩니다. 매시간마다 점검 중이라고 가정 해 봅시다. 전화가 잠자기 상태 일 때 어떤 수표도하지 않고 전화기를 사용할 때 수표를 다시 시작하는 것이 좋습니다. 그런 식으로 사용자는 결국 알림을 받지만 드레인은 최소화됩니다.

그래서 setInExactRepeating으로 시도했습니다. 나는 부팅 할 때 시작하지만, 또한 응용 프로그램 시작시 (대부분 설치 후 세션을 위해, 그리고 응용 프로그램이 "강제 종료"되더라도 실행 중인지 확인). 이 모든 수표를 합산하지 못하게하려면 어떻게합니까? (새로운 체크는 실행중인 것이 없거나 이전의 것이 멈춰야 할 경우에만 실행되어야합니다).

+0

이러한 테스트를 순차적으로 실행하는 것이 좋다고 가정하면 모든 검사를 실행하는 단일 'Intent'를 사용하십시오. –

답변

7

내가 ELAPSED_REALTIME (또는 RTC)과 함께 반복 setInexact 발견했습니다 아주 최소한의 배터리 소모를 달성하기 위해 아주 잘 작동합니다. 기존 pendingintent (동일한 인 텐트 및 id)에 플래그 FLAG_UPDATE_CURRENT를 사용하면 이미 존재하는 경우 현재 알람 일람표를 새로 고치기 만합니다. 또는 Ralgha가 제안한 코드를 추가하여 보류중인 의도를 이미 작성했는지 확인하고 알람을 설정했는지 확인한 다음 보류중인 의도 및 경고 일정을 설정하십시오. 두 방법 모두 배터리에 미치는 영향은 거의 없습니다 (무시할 수 있음). 중대한 유출은 빈번한 일정으로 무언가를하고 있습니다. 당신은 단지 매 시간마다 업데이트 할 화면이 꺼져하지 않을 경우, 앱이 (가 상대적으로 신속하게 처리 할 것으로 수행 멋지게 자체 후에 정리되어 가정) 거의 배터리를 사용한다는 사실

http://developer.android.com/reference/android/app/AlarmManager.html#ELAPSED_REALTIME

ELAPSED_REALTIME

이 알람은 장치를 깨우지 않습니다. 장치가 잠 들어있을 때 장치가 꺼지면 장치가 다음에 깨어날 때까지 장치가 전달되지 않습니다. 시스템이 경보 '단계를 조절할 수 있기 때문에

http://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating%28int,%20long,%20long,%20android.app.PendingIntent%29

setInexactRepeating는

이 경보는, setRepeating에서 제공하는 엄격한 재발 (INT, 오래, 오래, PendingIntent)보다 전력 효율이 있습니다 그것들을 동시에 발사하게하고, 필요 이상으로 잠자기에서 장치를 깨우는 것을 피하십시오. 설명 PendingIntent이 이미 존재하는 경우

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_UPDATE_CURRENT

FLAG_UPDATE_CURRENT

..., 다음을 계속하지만이 새로운 의도에 무엇과의 추가 데이터를 교체합니다. 이 기능은 엑스트라가 변경되는 인 텐트를 작성하는 경우 사용할 수 있습니다. 이전 PendingIntent를받은 엔티티가 새 엑스트라를 명시 적으로 부여하지 않은 경우에도 엔티티를 시작할 수 있습니다.

1

알람을 설정하기 전에 이미 설정되어 있는지 확인할 수 있으며 알람을 장치를 활성화 할 때까지 전달하지 않도록 플래그를 사용할 수도 있습니다.

 
if (PendingIntent.getBroadcast(context, 0, updateIntent, PendingIntent.FLAG_NO_CREATE) == null) 
{ 
    pendingIntent = PendingIntent.getBroadcast(context, 0, updateIntent, 0); 
    getSystemService(ALARM_SERVICE).setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(), AlarmManager.INTERVAL_HOUR, pendingIntent); 
} 
+0

감사합니다.하지만 "updateIntent"는 무엇을 말합니까? – erwan

+0

업데이트를 수행하는 서비스를 시작하려는 의도입니다. – Ralgha

+0

@erwan 만약 당신이 이미 PI를 만들고 이미 알람을 설정했는지 확인하기 위해 배터리 드레인 차이의 많은 부분을 볼 수 있을지 의심 스럽습니다. oncreate 동안 PI에서 FLAG_UPDATE_CURRENT로 다시 inexactrepeating을 설정하는 것보다). – logray

관련 문제