TAE

[android/Kotlin] PendingIntent 푸시메시지 클릭 - 푸시 메시지 구현 본문

카테고리 없음

[android/Kotlin] PendingIntent 푸시메시지 클릭 - 푸시 메시지 구현

tg-world 2023. 3. 23. 15:56
반응형

notification 클릭 시 데이터를 넘기는 방법인 pendingIntent에 대해 알아보겠습니다.

pendingIntent는 대표적으로

Notification (푸시 알림)으로 Intent 작업 수행 시

바탕화면 (런쳐) 위젯에서 Intent 작업 수행 시

AlarmManager를 통해 지정된 시간에 Intent 작업 수행 시

사용됩니다.

 

자세한 내용은 디벨롭 사이트에서 확인이 가능합니다.

https://developer.android.com/reference/android/app/PendingIntent

 

PendingIntent  |  Android Developers

 

developer.android.com

 

노티피케이션(푸시) 클릭 시 앞 포스팅에서 enum으로 지정해 놓은 어떤 타입이 클릭되었는지 알 수 있는 앱을 만들어 보겠습니다.

아래 포스팅에서 코드를 추가하였습니다.

https://tg-world.tistory.com/13

 

[android/Kotlin] 푸시 메시지 구현 - 푸시 메시지 구현(이미지 푸시, 긴글 푸시)

이번 포스팅에는 기본 노티피케이션, 큰 텍스트 블록 추가(긴 글 메시지 푸시), 이미지 노티피케이션에 대하여 포스팅해보겠습니다. 확장형 알림이라고도 하며, 확장형 알림에 관한 문서는 아래

tg-world.tistory.com


코드

MyFirebaseMessagingService.kt

val intent = Intent(this, MainActivity::class.java).apply {
    putExtra("notificationType","${type.title} 푸시 클")
    addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
}

val pendingIntent = PendingIntent.getActivity(this, type.notificationId, intent, FLAG_UPDATE_CURRENT)


val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
    .setSmallIcon(R.mipmap.ic_launcher)
    .setContentTitle(title)
    .setContentText(notificationMessage)
    .setPriority(NotificationCompat.PRIORITY_HIGH)
    .setAutoCancel(true)
    .setContentIntent(pendingIntent)

PendingIntent.getActivity로 넘겨줄 파라미터는

1. Context정보

2. requestCode -> PendingIntent를 구분하기 위한 고유 코드

3. 실행할 Intent

4. FLAG 값

  • FLAG_CANCEL_CURRENT → 이전에 생성한 PendingIntent 취소 후 새로 생성
  • FLAG_NO_CREATE → 이미 생성된 PendingIntent 가 있다면 재사용 (없으면 Null 리턴)
  • FLAG_ONE_SHOT → 해당 PendingIntent를 일회성으로 사용
  • FLAG_UPDATE_CURRENT → 이미 생성된 PendingIntent 가 있다면, Extra Data 만 업데이트

MainActivity.kt

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    setIntent(intent) // 새로운 인텐트로 갱신

    notificaitonResult(true)
}

private fun notificaitonResult(isNewIntent: Boolean = false) {
    binding.screenResultTV.text = (intent.getStringExtra("notificationType") ?: "아이콘 클릭") +
            if (isNewIntent) {
                "으로 갱신 되었습니다."
            } else {
                "으로 실행 되었습니다"
            }
}

onNewIntent를 오버라이드 해줍니다.

해당 화면이 이미 스택이 있을 경우 onCreate를 호출하는 것이 아닌 onNewIntent를 호출합니다.

setIntent로 새로운 인텐트로 갱신될 수 있게 해 줍니다.

onNewIntent가 호출될 때 notificationResult를 ture로 넘겨주고,

onCreate일 경우는 false로 넘겨줍니다.

 

isNewIntent값으로 갱신되었는지, 처음실행되었는지 구분하며,

notificatioinResult 메서드를 만들어 결과 Textview에 아이콘을 클릭했는지, 푸시로 클릭했는지 여부를 판단하며

notificationType이 있을 경우는 푸시 클릭해서 들어온 것으로, 앞서 putExtra로 넘겨준 title값을 표시하여 줍니다.

 

 

반응형
Comments