안드로이드에서 앱을 만들다 보면,

Alarm기능을 구현해야 할 때가 있습니다.


본격적인 알람앱이 아니어도,

유저가 원하는 시간에 어떠한 노티가 와야 하는경우가 있기 때문인데요.


오늘은 Alarm기능에 대해서 정리해 보겠습니다.



1. Alarm 기능의 구현


안드로이드에서 Alarm은, 안드로이드 시스템의 AlarmManager에게 알람기능을 부탁하여 실행되도록 하는데요.

이 AlarmManager에게 어떤 receiver를 호출할지에 대한 intent를 가지고 있는 PendingIntent와 

얼마나 delay 된 후 실행시킬지를 알려주어서 set을 해줍니다.


Alarm이 set되면,  정해진 시간에 AlarmManager가 receiver에게 broadcast 해주고,

receiver가 이를 받아서 service를 호출하여 알람기능을 실행시키는 거구요.


좀 복잡하지만, 실제로 코드로 구현하면서 정리해 보겠습니다.



2. 시간 설정


가장 먼저 알람을 울릴 시간을 설정하도록 하겠습니다.

실제로 구현한다면, FragmentDialog등을 통해서 유저에게 값을 받아오겠지만,

여기서는 코드 내에서 값을 지정하도록 하겠습니다.


오후 10시간 48분 8초로 예약을 Calendar객체를 생성해 set하였습니다.



3. Receiver 생성


이제, 정해진 시간에 AlarmManager에게 호출을 받을, Receiver를 생성하는데요.

클래스 명은 AlarmReceiver로 하겠습니다.


Receiver의 생성은 아래의 글을 참조해 주세요.

>>> Android 에서 Broadcast Receiver 로 시스템 이벤트 받아보기 <<<


onReceive의 구현은 아래에서 하도록 하겠습니다.




생성된 receiver에는 ALARM_START라는 intent-filter를 넣어 주어서,

intent호출시에 사용하도록 하겠습니다.




4. PendingIntent 생성


AlarmManager에게 실행을 부탁할 PendingIntent 를 생성할텐데요,

이 때, 어떤 Receiver를 호출할 지에 대한 intent를 인자로 전달하겠습니다.


intent를 생성할 때, 위에서 만든 intent-filter를 사용합니다.

pendingIntent에는, requestCode와 intent, 그리고 해당 PendingIntent에 대한 FLAG값을 인자로 넣어줍니다.




위에서 사용하는 Flag 들은 다음과 같은데요.

  • FLAG_UPDATE_CURRENT : Pending인텐트가 이미 존재할 경우, Extra Data를 모두 대체한다.
  • FLAG_CANCEL_CURRENT : Pending인텐트가 이미 존재할 경우, 기존 Pending인텐트를 cancel하고 다시 생성한다.
  • FLAG_IMMUTABLE : 이름에서 알 수 있듯이, 기존 PendingIntent 는 변경되지 않구요, 새로 데이터를 추가한 PendingIntent를 보내도 무시한다 입니다.
  • FLAG_NO_CREATE: Pending인텐트가 기존에 존재하지 않으면, Null을 return한다.
  • FLAG_ONE_SHOT : 이름이 아주 직관적인데요, 한번만 사용할 수 있는 PendingIntent란 뜻 입니다.

여기서는 PendingIntent. FLAG_UPDATE_CURRENT 를 사용하겠습니다.



4. AlarmManager


pendingIntent를 준비하였으니, AlarmManager의 객체를 얻어와서, 설정하겠습니다.
시스템서비스 이므로, getSystemService()메소드를 사용하여 얻어오구요.

set메소드를 이용해서, AlarmType과, 위에서 Calendar객체로 지정한 시간,
그리고 pendingIntent를 인자로 넣어줍니다.


AlarmType은 다음과 같이 4가지인데요.

여기서는 RTC_WAKEUP을 사용하겠습니다.

  • RTC_WAKEUP :  인자로 넘겨진, 시간을 기준으로 알람이 알람이 동작하여, pendingIntent를 전달합니다.
  • RTC : 이름에서 볼 수 있듯이, 위와 똑같지만, sleep모드에 들어간 기계를 깨우지는 않습니다.
  • ELAPSED_REALTIME_WAKEUP :  안드로이드 기계가 부팅된 시점을 기준으로 알람이 울립니다.
  • ELAPSED_REALTIME : ELAPSED_REALTIME_WAKEUP과 같지만, sleep모드에 들어갔다면 깨우지는 않습니다.


5. Service 생성


이제, Receiver가 호출되면, receiver가 다시 Service를 호출할 텐데요.

이 때 사용할 Service를 생성하겠습니다.


서비스를 생성하는 방법은 아래링크글을 참조해주세요.

>> Android에서 Service 로 Background 에서 음악 플레이 하기 <<


서비스를 생성하고, 

실행이 되면, 아래와 같이 간단한 토스트 팝업이 나오도록 하겠습니다.




6. Receiver 구현


마지막으로 남은 일은, Receiver부분을 구현하는 것인데요.




최종적으로 코드를 실행시키면,

아래와 같이 토스트가 동작하는 것을 확인할 수 있습니다~.




728x90
  1. 추가는 어떻게 하나요? 복수 여러개

  2. i'm developer, not coder 2020.11.12 11:21 신고

    안녕하세요
    혹시 broadcastReceiver만 작동해도 toast 메시지를 받을 수 있는데 service를 사용한 이유가 있을까요?

+ Recent posts