개발하는 두더지

kotlin + firebase 를 이용한 Push Notification 구현(2) 본문

Java,Android

kotlin + firebase 를 이용한 Push Notification 구현(2)

덜지 2018. 7. 19. 17:21

Android O [ 8.0 API 26 ] 버전부터 모든 알림은 할당되야합니다. 사용자가 환경설정 -> 앱 정보에서 직접 채널에서 세부 알림 기능들을 설정할 수 있습니다. ( 예 : 중요도, 소리, 진동, 중복 알람 없애기 등 )

하지만 Android N [ 7.1.1 API 25 ] 이하 버전 기기에서는 단순히 앱 정보에서 알람을 받을 것인지 말 것인지정도만 설정합니다.

앱은 여러개의 알림 채널을 가질 수 있으며, 그룹으로 설정할 수도 있습니다.


핵심은

targetSdkVersion 25   :  알림(Push Notification) 정상 동작

targetSdkVersion 26   :  알림 채널을 설정하지 않으면 알림이 정상적으로 오지 않음

즉, 반드시 채널을 설정해줘야합니다.


NotificationChannel class는 Android O [ 8.0 API 26 ]이후 생겨서 

Android N [ 7.1.1 API 25 ] 에서 사용하면 ClassNotFound Exception 발생



Notification importance

소스코드로 직접 채널마다 중요도를 설정할 수 있으며, 사용자가 환경설정에서 다시 변경할 수도 있습니다.

- Urgent    :    소리가 나고 헤드업 알림

- High       :     소리가 남

- Medium  :    소리 안남

- Low       :    소리 안나고 작업표시줄에 표시 안됨


Android 7.1 이하 버전에서는 Notification의 priority에 의해 결정됩니다.


아래와 같이 알림 채널을 구현해줍니다.

val CHANNEL_ID = "CollocNotification"
val CHANNEL_NAME = "CollocChannel"
val description = "This is Colloc channel"
val importance = NotificationManager.IMPORTANCE_HIGH

var notificationManager: NotificationManager = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

if( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, importance)
channel.description = description
channel.enableLights(true)
channel.lightColor = Color.RED
channel.enableVibration(true)
channel.setShowBadge(false)
notificationManager.createNotificationChannel(channel)
}


Oreo 기기





Nougat 기기





메시지를 받았을 때




전체 코드

class CollocFirebaseMessagingService : FirebaseMessagingService() {

private val TAG = "FirebaseService"

/**
* FirebaseInstanceIdService is deprecated.
* this is new on firebase-messaging:17.1.0
*/
override fun onNewToken(token: String?) {
Log.d(TAG, "new Token: $token")
}

/**
* this method will be triggered every time there is new FCM Message.
*/
override fun onMessageReceived(remoteMessage: RemoteMessage) {
Log.d(TAG, "From: " + remoteMessage.from)

if(remoteMessage.data != null) {
Log.d(TAG, "Notification Message Data: ${remoteMessage.data}")
sendNotification(remoteMessage.data.toString())
}
}

private fun sendNotification(body: String?) {
val intent = Intent(this, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
putExtra("Notification", body)
}

val CHANNEL_ID = "CollocNotification"
val CHANNEL_NAME = "CollocChannel"
val description = "This is Colloc channel"
val importance = NotificationManager.IMPORTANCE_HIGH

var notificationManager: NotificationManager = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

if( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, importance)
channel.description = description
channel.enableLights(true)
channel.lightColor = Color.RED
channel.enableVibration(true)
channel.setShowBadge(false)
notificationManager.createNotificationChannel(channel)
}

var pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
val notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

var notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
.setLargeIcon(BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher))
.setSmallIcon(R.mipmap.ic_launcher_round)
.setContentTitle("Colloc Notification")
.setContentText(body)
.setAutoCancel(true)
.setSound(notificationSound)
.setContentIntent(pendingIntent)

notificationManager.notify(0, notificationBuilder.build())
}
}


출처 및 참고

Notification Channels



Comments