본문 바로가기

Android + Kotlin

[Android + Kotlin] Notification Trampolines 이슈 해결하기

반응형

얼마전에 사용자 문의로 들어온 이슈인데, statusbar에 푸시 알림을 눌러도 앱실행이 되지 않는다는 내용이었습니다.

주변에 있는 안드로이드 폰에서 재현도 안되고..

특정 설정에 따라서 발생할만한 이슈도 아니어서.. 조금 난감한 상황이었습니다.

 

이것저것 해보던 중에 "다른 앱 위에 표시" 설정을 OFF 로하니 재현이 되었습니다.

 

원인은 "Notification Trampolines" 이슈였습니다.

https://developer.android.com/about/versions/12/behavior-changes-12?hl=ko#notification-trampolines 

 

동작 변경사항: Android 12를 타겟팅하는 앱  |  Android Developers

Android 12를 타겟팅하는 앱에 영향을 주는 Android 12의 변경사항을 알아봅니다.

developer.android.com

안드로이드 12이상을 타켓하는 경우, PendingIntent를 broadcast receiver나 service에서 시작할 수 없다는 내용입니다.


 

그런데, 왜!! "다른 앱 위에 표시" 와는 무슨 관계가 있을까?

 

위의 설정을 하는 경우엔, boardcast receiver와 service에서 앱 화면을 표시할 수 있도록 예외가 적용되기 때문입니다.

 

이제 원인도 알았으니 수정을 진행합니다.


 

기존에 구현된 내용은, pendingIntent에 broadcast receiver 를 등록하여, 사용자가 알람을 누를 경우에 해당 broadcast receiver에서 받도록 개발되었습니다.

그리고, receiver에서 앱 상태에 따라서 앱을 새로 시작시킬지, 현재 앱 화면에서 Activity만 표시할지를 판단하더군요.

 

수정 방법을 고민하면서 foreground service나 back stack 을 이용한 방법도 해봤지만 원하는 결과가 나오지 않았습니다.

그래서, 가장 처음 생각했고 심플한 방법인 PendingIntent.getActivity() 를 사용하기로 했습니다.

 

다만, PendingIntent로 이동하는 Activity는 기존 broadcast receiver에서 하는 일만 하고, 화면에는 나타나지 않도록 했습니다.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    /**
    * 화면 표시가 안되도록하기 위해 onCreate()에서 모두 처리후에 finish()를 시킴
    **/
    if({앱인스턴스가 있니} == true) {
        if({앱인스턴스}.isFinishing || {앱인스턴스}.isDestroyed) {
        	// 앱 종료 상태 처리
        } else {
        	// 앱 실행 상태 처리
        }
    } else {
    	// 앱 종료 상태
    }
    finish()
}

 

 

AndroidManifest.xml에 Activity 등록해주고, 이제 PendingIntent 등록해주는 곳을 수정합니다.

 

val intent = Intent(applicationContext, FcmResultActivity::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
	...
}

val pendingIntent = PendingIntent.getActivity(
	applicationContext, 
	System.currentTimeMillis().toInt(), 
	intent, 
	PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

 

위와같이 PendingIntent가 Activity 를 호출하도록 수정하여, Notification Trampolines 이슈를 해결하였습니다.


 

오늘도 존버!! 끝~!!

반응형