[안드로이드]AlarmManager setInexactRepeating() 함수의 주기

프로그래밍/안드로이드2020. 10. 11. 19:55

안드로이드에서 특정 시간마다 주기적으로 어떤 동작을 하고 싶을 때 사용되는 방법 중의 하나가 AlarmManager입니다.

 

안드로이드 공식 홈페이지에 자료가 꽤 잘 나와있습니다.

developer.android.com/training/scheduling/alarms

 

아래의 스택오버플로우 예제도 같이 보면 좋을 것 같네요.

stackoverflow.com/a/45408290/7225691

 

간단하게 동작 방법을 설명하면

private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
...
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime() +
        60 * 1000, alarmIntent);

AlarmManager 객체를 생성한 후 Intent/PendingIntent를 이용해서 주기적으로 intent broadcast를 받을 클래스를 명시해주면 됩니다. 그러면 안드로이드 프레임워크에서 주기적으로 intent가 broadcast되니.. 이를 처리할 broadcast receiver를 만들고.. 여기서 원하는 동작을 설정하면 됩니다.

public class MyBroadcastReceiver extends BroadcastReceiver {  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        //코드 작성
    }  
}  

 

여기서 생각해야할 점은.. 안드로이드 단말(스마트폰)은 디스플레이가 항상 on이 되어있는 것이 아니고.. 디스플레이가 off가 되면 전원 소모를 줄이기 위해 cpu도 sleep 모드?로 된다는 것입니다.

AlarmManager에서 특정 동작을 주기적으로 실행하기 위해서는 sleep 모드에서 깨어나는 것도 필요할 것입니다. 그러면 전력 소모가 늘어나고.. wake lock 관련 문제가 생길 가능성도 있습니다.

 

그래서 가능하면 전력 소모에 문제가 없게끔.. RTC_WAKEUP 대신 RTC인자를 사용하려고 하고.. set()함수 대신 setInexactRepeating() 함수를 사용 하려고 합니다.

 

(RTC 옵션으로 알람을 설정하면 cpu가 슬립모드일 때 알람이 울리지 않고 queue에 쌓였다가.. 디스플레이가 켜졌을 때 queue에 있던 알람이 한꺼번에 오는 것 같음)

 

setInexactRepeating()함수는 아래와 같이 사용할 수 있는데 set()함수와 다른 점은.. 반복 시간을 자유롭게 설정하지 못한다는 것입니다.

alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
        AlarmManager.INTERVAL_DAY, alarmIntent);

 

AlarmManager.INTERVAL_DAY

AlarmManager.INTERVAL_FIFTEEN_MINUTES

AlarmManager.INTERVAL_HALF_HOUR

AlarmManager.INTERVAL_HOUR

AlarmManager.INTERVAL_HALF_DAY

AlarmManager.INTERVAL_DAY

 

위의 상수를 사용해야 한다고 하는데 폭이 좀 좁은 편입니다.

 

제가 궁금한 것은.. 좀 더 정확한 주기 설정을 위해 AlarmManager.INTERVAL_FIFTEEN_MINUTES*2 나 AlarmManager.INTERVAL_HOUR*5 등의 표현으로 설정할 수 있냐는 것입니다.

(왜 공식 홈에 이런 안내는 없는지 모르겠네요 ㅜㅜ)

 

간단하게 테스트 해보니 동작하는 것 같습니다.. ㅎㅎ;;

 

2020-10-11 19:24:00.079 17635-17635/com.yyy D/YYY: onReceive
2020-10-11 19:54:00.033 17635-17635/com.yyy D/YYY: onReceive

 

아참 그리고.. SystemClock.elapsedRealtime()를 사용하려면.. AlarmManager.ELAPSED_REALTIME_WAKEUP 종류를 사용해야 합니다. SystemClock.elapsedRealtime() 함수는 부팅 후부터 흐른 시간을 반환하는 함수입니다.

alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_HALF_HOUR,
        AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);

작성자

Posted by 드리머즈

관련 글

댓글 영역