지난 포스팅과 이어지는 Notification 관련 포스팅이다.
알림드로어의 알림을 클릭했을 때의 동작을 구현해보고,
Notification Channel과 Notification ID를 변경해가며 알림 드로어를 살펴본다.
알림 클릭 이벤트 - PendingIntent
PendingIntent는 자신의 앱에서 지정한 권한과 행동을 다른 앱에 부여하는 Intent이다.
즉, Intent를 당장 수행하지 않고, 특정 시점에 수행할 수 있도록 해주는 Class이다.
여기서 말하는 '특정 시점'이란 앱이 구동되지 않고 있을 때가 포함될 수 있기에,
Notification으로 Intent를 실행한다면 PendingIntent를 필수적으로 사용해야 한다.
대표적으로 카카오톡 알림을 클릭하여 채팅방으로 진입하는 시나리오를 상상해볼 수 있다.
위 시나리오처럼, 알림을 클릭하여 Activity를 전환하는 예제를 구현해보자.
✅ PendingIntent 생성
val intent = Intent(applicationContext, SecondActivity::class.java)
val pendingIntent = PendingIntent.getActivity(applicationContext, 0, intent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)
SecondActivity로 전환하는 Intent를 생성해준 뒤 PendingIntent를 생성해준다.
PendingIntent.getActivity() / PendingIntent.getService() / PendingIntent.getBroadCast() 등
각자의 상황에 맞게 사용하기 바란다.
PendingIntent.getActivity() 함수의 파라미터가 4개나 있는데, 하나씩 살펴보자.
사실 유심히 봐야할 부분은 Flag 정도다.
① Context : Context 정보
② Request Code : PendingIntent를 식별하기 위한 고유 코드
③ Intent : 실행할 Intent 객체
④ PendingIntent Flag :
Flag의 종류는 정말 다양하기 때문에 그 역할은 직접 공부하기 바란다.
새로운 액티비티를 생성할 지, 기존 액티비티를 재사용할 지 등을 고려하여
각자의 상황에 알맞게 Flag를 지정해주면 된다.
* API LEVEL 31 부터 FLAG_MUTABLE or IMMUTABLE 둘 중 하나를 반드시 명시해야 한다.
✅ Notification 생성 시 setContentIntent() 추가
val notification = NotificationCompat.Builder(applicationContext, channelId).apply {
...
setContentIntent(pendingIntent)
}.build()
지난 포스팅의 Notification을 생성하는 예제에 setContentIntent() 함수를 추가해주고,
위에서 생성해준 PendingIntent 객체를 넣어준다.
✅ 결과
알림을 클릭했을 때 Intent가 실행되는 것을 확인할 수 있다.
Notification Channel 식별 - 알림 카테고리에 대한 이해
Notification Channel은 안드로이드 버전 8부터 도입된 기능이다.
안드로이드 버전 8 미만에서 알림은 앱 단위로만 관리할 수 있었다.
하지만 안드로이드 8 부터는 알림을 앱 내부의 카테고리 단위로 관리할 수 있게 되었다.
하나의 알림 카테고리가 곧 하나의 Notification Channel을 의미한다.
실제로 [기기 설정] → [앱 알림] → [알림 카테고리] 경로를 찾아가보면
다음과 같이 다양한 알림 카테고리를 만나볼 수 있다.
사용자는 카테고리 단위로 알림을 on/off 하여 관리할 수 있는 것이다.
(전체 메시지 검색이 2개 있는 것은,, 카카오톡에서 예외처리가 부족했던 것으로 생각해볼 수 있다.
역시 완벽한 앱은 없다고 다시 한 번 느낀다.)
이제 지난 포스팅에서 Notification Channel을 생성했던 예제를 다시 보자.
✅ Notification Channel 생성
val channelId = "First Channel"
val channelName = "첫 번째 알림 채널"
val notificationManager = NotificationManagerCompat.from(applicationContext)
if (notificationManager.getNotificationChannel(channelId) == null) {
val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH)
notificationManager.createNotificationChannel(channel)
}
채널 식별 테스트를 위해 channelId와 channelName은 변경해 주었다.
위 처럼 알림 채널을 세팅해주고, 앱을 실행 후 알림 카테고리를 살펴보자.
다시 한 번 언급하지만, channelId가 알림 채널의 식별자이고
channelName은 알림 채널의 이름으로 표시되는 역할 뿐이다.
✅ 알림 카테고리 확인
알림 카테고리가 1개 생성되어 있는 것을 확인할 수 있다.
✅ channelID & Name 변경
val channelId = "Second Channel"
val channelName = "두 번째 알림 채널"
...
channelId를 변경하여 다시 빌드해보면,
다음과 같이 새로운 알림 카테고리를 확인할 수 있다.
✅ 알림 카테고리 재확인
알림 채널 단위가 알림 카테고리 단위라는 것을 이해하면
알림 채널에 대한 null 체크를 진행하는 이유에 대해 자연스레 알 수 있을 것이다.
Notification ID 식별
✅ NotificationManager.notify() 함수
지난 포스팅의 3번째 예제인 알림을 발생시키는 부분을 보자.
notificationManager.notify(0, notification)
notify() 함수의 첫 번째 파라미터는 Notification Id 값이다.
위 파라미터가 알림의 자체 식별자 역할을 한다.
✅ 동일한 Notification ID 테스트
버튼을 2개 만들고, title과 body를 구분하여 테스트해보자.
// 알림 세팅
fun notify1() {
val title = "첫 번째 알림"
val body = "알림 1 클릭되었습니다"
...
notificationManager.notify(0, notification)
}
fun notify2() {
val title = "두 번째 알림"
val body = "알림 2 클릭되었습니다"
...
notificationManager.notify(0, notification)
}
...
// 버튼 클릭 이벤트
notiButton1.setOnClickListener {
notify1()
}
notiButton2.setOnClickListener {
notify2()
}
버튼 2개에 각기 다른 title과 body를 세팅해주고,
notify() 함수의 Notification Id는 동일하게 0을 입력했다.
✅ 동일한 Notification ID 테스트 결과
각기 다른 내용의 알림이 2개 도착했지만,알림 드로어를 열어보면
마지막에 도착한 알림 1개만 표시되어 있는 것을 확인할 수 있다.
✅ 별개의 Notification ID 테스트
이번에는 Notification Id를 각기 다른 값으로 넣고 테스트 해본다.
fun notify1() {
...
notificationManager.notify(1, notification)
}
fun notify2() {
...
notificationManager.notify(2, notification)
}
...
✅ 별개의 Notification ID 테스트 결과
첫 번째 영상과 동일한 시나리오의 테스트이지만,
알림 드로어를 열어보면 2개의 알림이 도착해 있는 것을 확인할 수 있다.
✅ 결론
NotificationManager.notify() 함수의 Notification ID를 이용하면
알림 드로어의 알림을 구분해줄 수 있다.
지난 포스팅보다 Notification을 조금 더 깊게 알게된 것 같다.
다음 포스팅에서는 Notification 그룹화에 대해 알아보자.
'Android (안드로이드)' 카테고리의 다른 글
[Android] FCM (1) - FCM 이란? / FCM 사용법 / 테스트 메시지 수신 (8) | 2024.10.01 |
---|---|
[Android] Notification (3) - Group Notification / Notification 그룹화 (6) | 2024.09.17 |
[Android] Notification (1) - 알림 / 알림 사용해보기 (2) | 2024.09.15 |
[Android] 안드로이드 기기 고유 값 얻기 / 기기 식별자 / SSAID (4) | 2024.09.01 |
[Android] AES (2) - Android 환경에서 AES 사용하기 (0) | 2024.08.19 |