Android API26 오레오 버전부터 기존 Notification에서 Notification Channel을 추가해줘야 동작을 하도록 변경되었다.
자연스럽게 Channel을 구별할 수 있도록 Notification Channel ID도 부여해야한다. 하지만 나는 Notification을 안 써봐서 서치하는 중 뭐가 또 생겼다고 하니 둘의 명확한 차이점을 알 수 없었다.
기본적으로 Channel이 생긴 이유는 스마트폰에 접어들고 어플리케이션의 시장이 커짐에 따라 자연스럽게 어플의 규모도 커지게 되고,
하나의 알림만으로 충분했었던 소규모의 어플이 아닌, 다양한 상황에서의 알림을 주는 경우가 늘어나게 됐다.
기존에는 알림을 받기 싫으면 설정 -> 어플리케이션 -> 해당 앱 알림을 끄면 됐었다. 하지만 위에도 언급했듯이 하나의 어플의 모든 알람을 차단해버리면 정작 중요한 알림 (Ex - 채팅, 언급, 세일?)마저도 알림을 받지 못하게 되어 이를 해결하기 위해 구글은 하나의 어플 안에서도 사용자가 원하는 알림만을 수신할 수 있게도록 Notification Channel이 탄생하게 되었다.
사실 처음 써봐서 둘이 나눠진 이유가 매우 궁금했는데, 서론을 쓰면서 이미 두 ID의 차이를 말한듯 하다.
이를 확인하기 위한 가장 쉬운 방법은 시나리오별 알림을 발생시키는 것이다.
각 상황은 Notification을 3번 이상 발생하고 난 뒤 결과다.
여러 번 알림을 호출해도 상단바에 동일한 알림으로 받는다.
여러 번 알림을 호출해도 하나의 채널만이 생성된다.
여러 번 알림을 호출하면 해당 개수만큼의 알림이 상단바에 나타난다.
여러 번 알림을 호출해도 하나의 채널만이 생성된다.
여러 번 알림을 호출해도 상단바에 동일한 알림으로 받는다.
여러 번 알림을 호출하면 해당 개수만큼의 알림 채널이 생성된다.
여러 번 알림을 호출하면 해당 개수만큼의 알림이 상단바에 나타난다.
여러 번 알림을 호출하면 해당 개수만큼의 알림 채널이 생성된다.
단순하지만 역시 캡쳐된 사진으로 보는게 이해가 직관적으로 된다.
이 포스팅을 작성한 이유는 이번 프로젝트에서 알림기능과 더불어 Foreground Service도 사용해야 하는데,
Foreground Service의 경우도 사용자에게 Service가 백그라운드에서 돌고 있다는 사실을 알리기 위해 알림을 사용한다.
이런 상황에서 기존 알림과 서비스의 알림이 겹치게 되면 안되기에 이를 구분하는 ID에 대해 공부하게 되었다.
보면 알림 채널은 따로 만들 필요는 없어보이나 혹시 모르니까 두개의 ID를 구분하는것이 좋아보인다.
이번엔 GroupNotification에 대해 알아본다.
GroupNotification이란 여러개의 알림을 하나의 그룹으로 묶어놓는 기능인데, 자주 경험해봤을 UI이다.
위처럼 2개의 알림이 1개의 영역안에 들어가 있다. 그리고 이 Group Notification에서 몰랐던 사실이 하나 있다.
지금 개발하는 앱에서 알림이 오고 사용자가 알림을 클릭하면 관련된 Activity로 이동하는 기능이 있다.
이를위해 Notification Builder의 PendingIntent에 어떤 알림 타입인지를 명시하는 putExtra를 넣어줬다.
해당 Activity로 바로 이동하는 것이 아니라 알림 타입을 넣어준 이유는, 인증 및 로그인 및 서버 데이터 호출이 모두 Splash Activity에서 하기 때문에 무조건 거쳐야하고, Splash에서 준비를 마쳤을 때 이동해야하기 때문이다.
private fun getPendingIntent(alarmType: AlarmType?): PendingIntent {
val contentIntent = Intent(context, SplashActivity::class.java).apply {
action = Intent.ACTION_MAIN
putExtra("alarmType", alarmType)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addCategory(Intent.CATEGORY_LAUNCHER)
}
return PendingIntent.getActivity(
context,
alarmType?.REQUEST_CODE ?: 0,
contentIntent,
PendingIntent.FLAG_IMMUTABLE
)
}
그리고 알림이 여러개가 쌓인 경우에서 사용자가 Group Notification 자체를 클릭한 경우 어디로 가야하는지 명시하지 않았기에 기본적인 MainActivity로 이동하게 했었다.
private fun getGroupNotification(alarmType: AlarmType): NotificationCompat.Builder =
NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_arrow_down)
.setColor(context.getColor(R.color.main_blue))
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setGroupSummary(true)
.setContentIntent(getPendingIntent(DEFAULT_WINDOW // null))
.setGroup(NOTIFICATION_GROUP_NAME)
예상대로 알림이 동작할줄 알았으나, 알림이 Pop했을 때 클릭하면 이상하게 MainActivity로만 가게 되어 로그를 찍어본 결과, Splash에서 intent를 받았을 때 alarmType이 null로 오는것을 확인했다.
겪었던 이슈를 글로 표현하니 어디에 문제가 있는지 훨씬 잘 보이네?
몇 차례 테스트한 결과, Group Notification의 실행은 Group영역을 눌렀을 때 이외에도 PopUp된 Notification을 클릭하면 발생한다는 사실을 알게 되었다.
이 점을 유의하여 코딩을 해야할 듯 하다.
감사합니다!