[삽질 3] notification 클릭시 원하는 액티비티를 원하는 intentExtra 값으로 실행하려고 고생을 했다.
나는 모든 푸시 클릭시 LoginActivity 로 도달 후, intentExtra 의 데이터에 따라 다른 화면으로 넘어가도록 하였다.
서비스 특성상 회원 인증을 요구하는 화면이 많기 때문에 로그인 과정을 먼저 거치도록 한 것도 있지만, 찾아본 자료 중에 특정한 경우에 대해서는 android.intent.category.LAUNCHER 로 지정된 액티비만 실행시킨다는 글을 보았었고 LoginActivity 를 LAUNCHER 로 지정하였기 때문이다.
이때 LoginActivity 에서 onNewIntent 콜백을 override 하였지만, 로그를 찍어본 결과 해당 콜백이 호출된 적이 없었기 때문에 내일 추가로 확인이 필요하다.
확인한 결과 notification 을 클릭했을 때 해당 activity 를 onCreate 콜백부터 시작시키기 때문에 이에 이를 인지해두고 설계해야한다. 어쩌면 펜딩인텐트 생성시 인텐트에 줬던 플레그 때문일지도 모르겠다.
그리고 모든 문제를 해결해줬던건 펜딩 인텐트의 플레그였다.
코드로 보자면, FirebaseMessagingService 의 onMessageReceived() 함수 쪽에는 아래의 함수를 통해 notificationBuilder 에 PenddingIntent 를 더했다.
private fun addPendingIntent(
builder: NotificationCompat.Builder, pushIdx: Int, data: Map<String, String>) {
val loginIntent = Intent(this, LoginActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
// intent 에 데이터 집어넣기 (ex putExtra(..., ...))
}
val pendingIntent = PendingIntent.getActivity(
applicationContext,
pushIdx,
loginIntent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
builder.setContentIntent(pendingIntent)
}
이때 PendingIntent.FLAG_UPDATE_CURRENT 플래그를 더하니까 모든 문제가 해결되었다. penndingIntent 자체에 대한 공부가 부족한것 같다.
공부한 내용