https://developer.android.com/training/notify-user/build-notification?hl=ko
위의 안드로이드 공식 문서에 알림 띄우는 부분이 잘 정리가 되어 있어서
구체적인 방법에 대한 블로깅은 생략하고자 합니다.
여기서는 알림을 띄울 때 삽질 했던 부분에 대해서 남기고자 합니다.
제가 겪었던 문제는 2가지가 있습니다.
1. 알림들이 여러개 왔을 때, 무엇을 클릭하든 제일 처음 온 알림으로만 인식하는 문제
2. 상태창에만 알림이 뜨고 head up Notification이 나오지 않는 문제
1. 알림들이 여러개 왔을 때, 무엇을 클릭하든 제일 처음 온 알림으로만 인식하는 문제
알림 1, 2, 3이 왔을 때 무조건 1로만 가버리는 문제가 있었는데요..ㅂㄷㅂㄷ
PendingIntent의 개념?에 대해 잘 이해 못해서 생긴 문제였는데, 아래 코드로 바꾸면서 해결이 되었습니다.
// from
PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
// to
PendingIntent.getActivity(context, System.currentTimeMillis().toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT)
getActivity는 다음과 같이 구성되어 있는데요
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags) {
throw new RuntimeException("Stub!");
}
context와 requestCode가 같으면, 같은 pendingIntent로 취급해서 flag에 영향을 받게 됩니다.
flag가 FLAG_UPDATE_CURRENT라면 최신 알림으로 override 되어버립니다.
flag에 여러 종류가 있는데 여기서는 스킵하도록 하겠습니다.
2. 상태창에만 알림이 뜨고 head up Notification이 나오지 않는 문제
Ios에서는 기본적으로 헤드업알림으로 뜨는데, Android는 아니더라구요
결론부터 말씀드리자면, 알림 우선순위를 높게 설정해주면 해결되는 문제였습니다. (+ vibrate 설정해줘야 된다고 하더라구요..!)
Channel과 Notification builder 두 군데의 우선순위를 변경해줘야 합니다.
// channel
val channel = NotificationChannel(
context.getString(R.string.channel_name),
context.getString(R.string.channel_name),
NotificationManager.IMPORTANCE_HIGH // IMPORTANCE_HIGH로 세팅!!
)
// notification builder
NotificationCompat.Builder(context, context.getString(R.string.channel_name))
.setPriority(NotificationCompat.PRIORITY_HIGH) // PRIORITY_HIGH로 세팅!!
.setDefaults(NotificationCompat.DEFAULT_SOUND or NotificationCompat.DEFAULT_VIBRATE)
...