[발생 상황]
fcm을 받으면 notification.data를 받아서 그 data를 메인액티비티 extra로 전달하고 메인액티비티에서 해당 데이터를 가져와서 처리함
예를들어 아래와 같은 3개의 fcm이 와서 알림 3개가 쌓여있다고 가정하자
이 상황에서 fcm1,2를 클릭해도 각각 home, home2라는 데이터를 가져와서 처리하지않고 가장 마지막에 수신받은 fcm3이라는 데이터를 가져와서 처리하는 이슈 발생
[발생 원인]
메인액티비티로 이동하면서 데이터를 extra로 전달하는 pendingIntent를 만들때 flag에는 'FLAG_UPDATE_CURRENT'을, requestCode는 다 같은 값을 주었기 때문이다.
requestCode는 공식문서에 의하면 'Private request code for the sender' 인데 쉽게 설명하면 pendingIntent를 구분하는 id라고 생각해도 된다.
FLAG_UPDATE_CURRENT는 기존 intent가 있으면 기존 intent를 사용하되 extra 데이터만 변경하는 flag이다.
즉, 새로운 알림이 오면 이미 requestCode가 동일한 기존 pendingIntent가 있기 때문에 이것을 사용하되, extra만 (home1,2,3)만 변경하는 방식으로 작동했던 것이다.
위의 예시처럼 알림을 3개 받는 동안, extra가 매번 새로 수신받은 알림의 data로 변경되면서 결국에는 어떠한 알림을 클릭해도 가장 마지막으로 수신받은 알림의 data를 사용해 처리되었던 것이다.
[해결]
requestCode에 모두 다른 값이 들어 갈 수 있도록 알림을 받은 시간을 설정하여 알림을 받을 때 마다 다른 pendingIntent가 만들어지도록 수정하였다.
PendingIntent.getActivity(
this @MyFirebaseMessagingService,
System.currentTimeMillis().toInt(), //👈
intent,
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)