일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Django REST framework
- Rxjava2
- RxAndroid
- NDK
- dart
- Android
- 안드로이드 구글맵
- flutter firestore
- Django REST
- 알고리즘
- Django REST Android
- Kotlin
- 코틀린
- C/C++
- 프로그래머스
- RxJava
- android architecture component
- Python
- 안드로이드
- Android P
- UWP
- mfc
- Java
- android push
- C
- kodility
- Flutter TextField
- livedata
- FLUTTER
- C++
- Today
- Total
개발하는 두더지
kotlin + firebase 를 이용한 Push Notification 구현(2) 본문
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())
}
}
출처 및 참고
'Java,Android' 카테고리의 다른 글
Android NDK 빌드툴인 NDK-Build 와 CMake 정리 (1) | 2018.08.02 |
---|---|
kotlin + firebase 를 이용한 Push Notification 구현(3) (1) | 2018.07.19 |
[Android] Android P 변경사항 (0) | 2018.07.18 |
kotlin + firebase 를 이용한 Push Notification 구현(1) (3) | 2018.07.09 |
[Android] 안드로이드 뷰가 그려지는 과정 (0) | 2018.06.15 |