Development record of developer who study hard everyday.

레이블이 androidappbackground인 게시물을 표시합니다. 모든 게시물 표시
레이블이 androidappbackground인 게시물을 표시합니다. 모든 게시물 표시
, , , , , , , , ,

안드로이드 alarmManager 사용하기 (RTC_WAKEUP)

안드로이드 alarmManager 사용하기 (RTC_WAKEUP)

안드로이드 개발 블로그

회사에서 예전에 진행한 프로젝트를 수정, 보완할 일이 생겼다.

이 앱의 기능 중에 여자들의 생리일을 통해서 생리예정일, 배란일, 자가검진일 등을 알려주는 기능이 있었다.

특정한 날을 알려줄 때는 역시 알림을 띄워주는데, 고객사에서 알림이 오는지 안오는지 잘 모르겠다는 것이였다.

그래서 코드를 찬찬히 뜯어보기 시작했다.

그러다.... 그냥 내가 직접 알림을 띄우는 작업을 진행해보았다.

왜냐하면, 기존의 코드는 예전코드라서 android.evernote.job 라이브러리를 사용하고 있었다.

근데 어짜피, SDK 31 버전부터 deprecated 된다고해서 빨리 옮기는게 좋아보였다.

전체 코드를 보여주는 것보다는 간단하게 예시코드를 보여주겠다.

아래 코드는 안드로이드 공식문서를 참고해서 작성했습니다.

1. 알람매니저 세팅

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

long exactTime = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(2);
alarmMgr.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, exactTime, alarmIntent);

어려울 것 없다.

context를 통해서 AlarmManager 객체를 가져온다.

알람매니저를 실행했을 때 신호를 받을 AlarmReceiver.class를 Intent 객체에 담아준다.

(AlarmReceiver의 클래스명은 다르게해도된다.)

알람을 실행할 PendingIntent를 getBroadcast 메소드를 통해 만들어준다.

exactTime 변수에 2분뒤의 TimeMillis 객체를 저장해준다.

setAndAllowWhileIdle 메소드를 실행해준다.

setAndAllowWhileIdle 메소드는 앱이 포그라운드나 백그라운드에 있을 때 뿐만이 아니라 Idle 상태, 즉 doze 모드에 있을 때도 알림을 실행해준다.

AlarmManager.RTC_WAKEUP 타입은 기기가 도즈모드에 있을 때, 도즈모드를 깨워준다.

이 프로젝트에서 사용자의 생리 관련된 특정일을 알림으로 알려줄 때, 핸드폰이 도즈모드에 있더라도 알림을 받을 수 있게해야하기때문에 이런 설정을 사용했다.

이외에도 여러 메서드를 소개하자면,

setExact() : 배터리 절약 모드가 아니라면 거의 정확한 시간에 울린다.

setExactAndAllowWhileIdle() : setAndAllowWhileIdle 보다 더 정확한 시간을 제공한다.

setAlarmClock() : 정확한 시간에 작동한다.

setInexactRepeating() : 반복된 코드를 작동시키고 싶을 때 사용한다.


2. 브로드캐스트 리시버 정의

class AlarmReceiver : BroadcastReceiver() {
val TAG = this::class.java.simpleName

override fun onReceive(context: Context?, intent: Intent?) {
Log.d(TAG, "AlarmReceiver onReceive()")

NotificationTool.show(
context, "이번 달 유방암 자가검진일인 핑크터치 데이입니다",
null, "유방암 자가검진 시작", HashMap(), DetectionJob.NOTIFICATION_ID
)
}
}

알람매니저가 실행되었을 때, 신호를 받을 브로드캐스트 리시버를 저으이해준다.

이번 프로젝트에서는 신호를 받아서 알림을 띄워주었다. ㅎ

그리고 절대 까먹으면 안되는 것이 있다.

바로, 매니페스트 파일에도 BroadcastReceiver를 추가해주는 것이다.

<receiver android:name=".diary.job.alarm.AlarmReceiver"
android:exported="false"/>

3. WAKE_LOCK 권한추가

<uses-permission android:name="android.permission.WAKE_LOCK" />

manifest.xml 파일에 WAKE_LOCK 권한을 추가해준다.


이제 끝이다..... 가 아니다.

내가 이것때문에 삽질을 조금 했는데.... 알람매니저에서 AlarmManager.RTC_WAKEUP 모드르를 사용하려면 앱정보에서 백그라운드 제한을 해제시켜줘야한다.


안드로이드 앱정보

위 화면에서 "모바일 데이터"에 들어간다.

안드로이드 백그라운드 제한

위 화면에서 "백그라운드 데이터 사용 허용" 과 "데이터 절약 모드 사용 중일 때 데이터 사용 허용" 둘다 체크해준다.

이제 앱이 백그라운드든 포그라운드든 핸드폰이 도즈모드이든 상관없이 알림매니저가 잘 작동할 것이다!!



Share:
Read More