Android (안드로이드)

[Android] Notification (2) - 알림 클릭 이벤트 / PendingIntent / Notification Channel · Notification ID 식별 테스트

Oscar:) 2024. 9. 16. 12:31

 

 

 

지난 포스팅과 이어지는 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의 종류는 정말 다양하기 때문에 그 역할은 직접 공부하기 바란다.

 

 

PendingIntent  |  Android Developers

 

developer.android.com

 

 

새로운 액티비티를 생성할 지, 기존 액티비티를 재사용할 지 등을 고려하여

각자의 상황에 알맞게 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 그룹화에 대해 알아보자.