notification
create Notification
애플리케이션의 실행을 유도할 수 있어서 굉장히 중요한 요소이다.
간단한 예로 카카오톡 메시지 알림을 떠올려보자. 알림이 켜진 상태라면 다른 앱을 사용하는 도중에도 디바이스 상단에 메시지 알림이 도착하고, 몇 초뒤 메시지가 사라지는걸 볼 수 있다.
fullScreenIntent
를 사용하는 경우)setAuthenticationRequired(true)
설정setSmallIcon()
을 통해 설정setWhen()
을 사용하여 재정의 하거나 setShowWhen(false)
로 숨길 수 있음.setLargeIcon()
을 통해 설정setContentTitle()
을통해 설정setContentText()
를 통해 설정8.0 이전에는 앱의 알림 on/off만 있었지만 현재는 앱의 알림을 개별적인 채널로 관리할 수 있어 해당 채널에 알림을 on/off 할 수 있다.
inportrance
에 따라 결정되며, 사용자는 시스템 설정에서 해당 알림 채널의 중요도를 변경할 수 있다.모든 알림은 알림 창 및 배지와 같이 사용자를 방해하지 않는 경우는 표시된다.
알림 배지 수정
안드로이드 8.0 부터 새롭게 추가된 기능
이전에는 사용자가 설정에서 알림 메시지를 비활성화 하면 모든 메시지가 비활성화 되었다.
8.0 부터는 Notification Channel을 이용하여 알림 메시지를 채널이라는 그룹으로 묶어 관리할 수 있으며 사용사는 채널 별로 메시지 활성화 여부를 설정할 수 있다.
확인할 권한
안드로이드 13버전 부터는 Notification 사용을 위해
POST_NOTIFICATIONS 권한을 사용자로부터 확인 받아야 한다.
val permissionList = arrayOf(
Manifest.permission.POST_NOTIFICATIONS
)
setContentTitle("Notification 1")
setContentText("알림 메시지1 입니다")
setSmallIcon(android.R.drawable.ic_menu_search)
setAutoCancel(true) : 메시지를 터치하면 자동으로 메시를 제거 한다.
setContentIntent(pendingIntent1)
// Notification Channel을 등록하는 메서드
// id : 코드에서 채널을 관리하기 위한 이름
// name : 사용자에게 노출 시킬 이름
fun addNotificationChannel(id:String, name:String){
// 안드로이드 8.0 이상일 때만 동작하게 한다.
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
// 알림 메시지를 관리하는 객체를 추출한다.
val notificationManger = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
// id를 통해 NotificaitonChannel 객체를 추출한다.
// 채널이 등록된 적이 없다면 null을 반환한다.
// 등록된 적이 있는지 없는지 확인하기 위해 channel 선언
val channel = notificationManger.getNotificationChannel(id)
// 채널이 등록된 적이 없다면,
if(channel == null){
// 채널 객체를 생성한다.
// IMPORTANCE_HIGH : 중요도에 따라 설정, HIGH로 설정함
val newChannel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH)
// 단말기에 LED 램프가 있다면 램프를 사용하도록 설정한다.
newChannel.enableLights(true)
// LED 램프의 색상을 설정한다.
newChannel.lightColor = Color.RED
// 진동을 사용할 것인가
newChannel.enableVibration(true)
// 채널을 등록한다.
notificationManger.createNotificationChannel(newChannel)
}
}
}
// Notification 메시지 관리 객체를 생성하는 메서드
// Notification 채널 id를 받는다.
fun getNotificationBuilder(id:String) : NotificationCompat.Builder{
// 안드로이드 8.0 이상이라면
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
val builder = NotificationCompat.Builder(this, id)
return builder
} else {
val builder = NotificationCompat.Builder(this)
return builder
}
}
// NotificationBuilder를 가져온다.
val builder = getNotificationBuilder(NOTIFICATION_CHANNEL1_ID)
// 작은 아이콘
builder.setSmallIcon(android.R.drawable.ic_menu_search)
// 큰 아이콘
val bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)
builder.setLargeIcon(bitmap)
// 숫자 설정
builder.setNumber(100)
// 타이틀 설정
builder.setContentTitle("Content Title 1")
// 메시지 설정
builder.setContentText("Content Text 1")
// 메시지 객체를 생성한다.
val notification = builder.build()
// 알림 메시지를 관리하는 객체를 추출한다.
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
// 메시지를 표시한다.
// 첫번째 매개변수에 넣어주는 정수는 단말기 전체에서 메시지를 구분하기 위한 값
// 값은 값으로 메시지를 계속 보여주면 메시지가 갱신 것이고
// 다른 값으로 메시즈를 계속 보여주면 메시지가 각각 따로 나타난다.
notificationManager.notify(10, notification)
Notification 메시지를 통해 애플리케이션의 Activity를 실행할 수 있으며 이 때 Pending Intent를 사용한다.
Pending Intent를 통해 실행되는 Activity로 데이터를 전달 할 수 있다.
val newIntent = Intent(this@MainActivity, Notification1Activity::class.java)
val pendingIntent1 = PendingIntent.getActivity(this@MainActivity, 10, newIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
builder.setContentIntent(pendingIntent1)
알림 메시지에 Button과 같은 것을 배치하여 이를 눌렀을 때 지정된 Activity를 실행할 수 있다.
안드로이드 4.0 까지는 메시지당 하나의 Activity만 실행이 가능했지만 4.1 이후로 Action이 제공되어 하나의 메시지에서 여러 Activity를 선택적으로 실행할 수 있게 되었다.
// Action 설정
val newIntent2 = Intent(this@MainActivity, Notification2Activity::class.java)
newIntent2.putExtra("data3", 200)
newIntent2.putExtra("data4", "반갑습니다")
val pendingIntent2 = PendingIntent.getActivity(this@MainActivity, 100,
newIntent2, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
// Action을 생성한다.
// 첫 번째 : 아이콘 설정
// 두 번째 : 표시할 문자열
// 세 번째 : PendingIntent
val builder2 = NotificationCompat.Action.Builder(
android.R.drawable.ic_dialog_alert, "Action", pendingIntent2)
val action2 = builder2.build()
builder.addAction(action2)
안드로이드 4.1에 새롭게 추가된 부분으로 4.0 이하 버전에서는 기본 알림 메시지로 표시된다.
안드로이드 4.1 이후 부터는 알림 메시지를 접었다 폈다 하면서 부가 정보를 표시할 수 있다.
// BigPicture 설정
val big = NotificationCompat.BigPictureStyle(builder)
// 보여줄 이미지를 설정한다.
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.img_android)
big.bigPicture(bitmap)
big.setBigContentTitle("Big Content Title")
big.setSummaryText("Summary Text")
메시지를 펼쳤을 때 장문의 문자열을 표시할 수 있다.
// Big Text 설정
val big = NotificationCompat.BigTextStyle(builder)
big.setBigContentTitle("Big Content Title")
big.setSummaryText("Summary Text")
big.bigText("""동해물과 백두산이
|마르고 달도록
|하느님이 보우하사
|우리나라 만세
""".trimMargin())
메시지를 펼쳤을 때 문자열 들을 표시할 수 있다.
// InBox 설정
val inbox = NotificationCompat.InboxStyle(builder)
inbox.setSummaryText("Summary Text")
inbox.setBigContentTitle("InBox Style")
inbox.addLine("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
inbox.addLine("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
inbox.addLine("ccccccccccccccccccccccccccccccccccccccc")
inbox.addLine("ddddddddddddddddddddddddddddddddddddd")
inbox.addLine("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
inbox.addLine("ffffffffffffffffffffffffffffffffffffffff")
inbox.addLine("gggggggggggggggggggggggggggggggggggggggggg")
안드로이드 9.0에서 새롭게 추가된 Notification
다자간의 메시지 내용을 표시하는 용도로 사용한다.