상태 바는 화면 상단의 한 줄을 의미하며 이곳에 배터리, 네트워크 시간 등 시스템의 상태 정보가 출력된다. 이 상태 바에 앱의 정보를 출력하는 것을 알림 이라고 한다.
원래 상태 바는 시스템에서 관리하는 곳이며 앱이 직접 제어할 수 없지만, 앱에서 시스템에 의뢰하면 상태 바에 앱의 알림을 출력할 수 있다.
프로그래밍 구조가 다른 이벤트 처리와는 다르며 알림을 위해 제공하는 API를 이용해야 한다.
알림은 NotificationManager의 notify() 함수로 발생한다. notify() 함수에는 NotificationCompat.Builder가 만들어 주는 Notification 객체를 대입하며 이 객체에는 알림 정보가 저장된다. 그런데 NotificationCompat.Builder를 만들 때 NotificationChannel정보를 대입해 줘야 한다.
Notification을 만들려면 NotificationCompat.Builder가 필요한데 빌더를 만드는 방법이 API 레벨 26 버전부터 변경되었다. 26 버전 이전까지는 다음 생성자를 사용했다.
- Builder(context: Context!)
26 버전부터는 채널의 식별값을 빌더의 생성자 매개변수에 지정해줘야 한다.
- Builder(context: Context!, channelId:String!)
26 버전부터는 알림을 채널로 구분하는데, 앱의 알림을 채널별로 구분할 수 있게 되었다.
// 알림 채널 생성자 NotificationChannel(id: String!, name: CharSequence!, importance: Int)
매개변수로 채널의 식별값과 설정 화면에 표시할 채널 이름을 문자열로 지정한다. 세 번째 매개변수는 이 채널에서 발생하는 알림의 중요도이며 다음의 상수로 지정한다.
중요도 상수 | 설명 |
---|---|
NotificationManager.IMPORTANCE_HIGH | 긴급 상황으로 알림음이 울리며 헤드업으로 표시 |
NotificationManager.IMPORTANCE_DEFAULT | 높은 중요도이며 알림음이 울림 |
NotificationManager.IMPORTANCE_LOW | 중간 중요도이며 알림음이 울리지 않음 |
NotificationManager.IMPORTANCE_MIN | 낮은 중요도이며 알림음도 없고 상태 바에도 표시되지 않음 |
함수나 프로퍼티로 설정할 수 있다.
fun setDescription(description: String!): Unit
fun setShowBadge(showBadge: Boolean): Unit
fun setSound(sound: Uri!, audioAttributes: AudioAttributes!): Unit
fun enableLights(lights: Boolean): Unit
fun setLightColor(argb: Int): Unit
fun enableVibration(vibration: Boolean): Unit
fun setVibrationPattern(vibrationPattern: LongArray!): Unit
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
val builder: NotificationCompat.Builder
if(Builder.VERSION.SDK_INT >= Builder.VERSION_CODES.O) {
val channelId = "one-channel"
val channelName = "My Channel One"
val channel = NotificationChannel(
channelId,
channelName,
NotificationManager.IMPORTANCE_HIGH
)
// 채널에 다양한 정보 설정
channel.description = "My Channel One Description"
channel.setShowBadge(true)
val uri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val audioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
channel.setSound(uri, audioAttributes)
channel.enableLights(true)
channel.lightColor = Color.RED
channel.enableVibration(true)
channel.vibrationPattern = longArrayOf(100, 200, 100, 200)
// 채널을 NotificationManager에 등록
manager.createNotificationChannel(channel)
// 채널을 이용해 빌더 생성
builder = NotificationCompat.Builder(this, channelId)
} else {
builder = NotificationCompat.Builder(this)
}