Notification
안드로이드 푸시 팝업
순서
- NotificationManager 얻어옴
- 오레오 버전 이상이면 Channel 생성 아니면 패스
- PendingIntent생성
- NotificationCompat 생성
- 빌드한 Notification을 notificationManager에 붙여주면 끝!
- Notification 클릭 시 핸들
1.NotificationManager 얻어옴
val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
2.오레오 버전 이상이면 Channel 생성 아니면 패스
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(getString(R.string.app_name) + getString(R.string.priority_high), getString(R.string.app_name) + getString(R.string.priority_high), NotificationManager.IMPORTANCE_HIGH)
channel.description = getString(R.string.app_name) + getString(R.string.priority_high)
channel.enableLights(true)
channel.lightColor = Color.BLUE
channel.enableVibration(true)
channel.vibrationPattern = longArrayOf(100, 200, 100, 200)
channel.lockscreenVisibility = NotificationCompat.VISIBILITY_PUBLIC
notificationManager.createNotificationChannel(channel)
}
Channel 생성 시 IMPORTANCE 설정에 따라 알림이 다르다.
NotificationManager.IMPORTANCE_HIGH :소리 및 팝업 (헤드업 알림)
NotificationManager.IMPORTANCE_DEFAULT : 소리
NotificationManager.IMPORTANCE_LOW : 소리 없음
NotificationManager.IMPORTANCE_MIN : 소리 및 시각적 알림 없음
3.PendingIntent생성
val intent = Intent(applicationContext, MainActivity::class.java)
remoteMessage.data?.apply {
intent.putExtra(JSON_LETTER, get(JSON_LETTER))
intent.putExtra(JSON_ANSWER, get(JSON_ANSWER))
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
}
val pendingIntent = PendingIntent.getActivity(applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
알림 팝업을 누르게 되면 PendingIntent 에 실어 두었던 Intent 정보를 가져와서 사용할 수 있다.
4.NotificationCompat 생성
val builder = NotificationCompat.Builder(applicationContext, getString(R.string.app_name) + getString(R.string.priority_high))
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body)
.setDefaults(Notification.DEFAULT_VIBRATE)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
5.빌드한 Notification을 notificationManager에 붙여주면 끝!
notificationManager.notify(1, builder.build())
6.Notification 클릭 시 핸들
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
intent?.apply {
if (intent.extras.getString(JSON_ANSWER) != null) {
val jsonLetter = intent.extras.getString(JSON_LETTER)
val jsonAnswer = intent.extras.getString(JSON_ANSWER, EMPTY)
if (supportFragmentManager.backStackEntryCount > 0) {
if (jsonLetter == null) {
val answer = Gson().fromJson(jsonAnswer, Answer::class.java)
openReAnswers(answer)
} else {
openReAnswers(jsonLetter, jsonAnswer)
}
return
} else {
openHome()
if (jsonLetter == null) {
val answer = Gson().fromJson(jsonAnswer, Answer::class.java)
openReAnswers(answer)
} else {
openReAnswers(jsonLetter, jsonAnswer)
}
return
}
}
}
}
Notification 클릭 시 onNewIntent 메소드 호출 되는데 여기서 intent에 넣어 두었던 데이터를 사용하면 된다.