알림 띄우기
알림 채널
상태바는 화면 상단의 한 줄을 의미 하며 이곳에 배터리, 네트워크, 시간 등 시스템의 상태 정보가 출력됩니다. 상태 바에 앱의 정보를 출력하는 것을 알림 notification이라고 합니다. 상태바는 시스템에서 관리하는 곳이며 앱이 직접 제어할 수 없습니다. 그렇지만 앱에서 시스템에 의뢰히면 시스템에서 관리하는 상태 바에 앱의 알림을 출력할 수 있습니다. 그렇기 때문에 지금까지 배워 왔던 화면을 구성하거나 사용자 이벤트를 처리하는 프로그래밍과는 구조가 다르며 알림을 위해 제공하는 API를 이용해야 합니다.
NotificationChannel로 알림 채널을 만들고 이 채널 정보를 대입해 Notification Compat.Builder를 만든 다음, 이 빌더로 Notification 객체를 만듭니다. 이 Notification 객 체를 NotificationManager의 notify() 함수에 대입하는 구조입니다.
Notification을 만들려면 NotificationCompat.Builder가 필요한데 26 버전 이전까지는 빌더를 만들 때 NotificationChannel 정보가 필요 없었습니다.
Builder(context: Context!)
그렇지만 26 버전부터는 생성자가 deprecated되어 빌더를 만들 때 NotificationChannel을 만들고 이 채널의 식별 값을 빌더의 생성자 매개변수에 지정해 줘야 합니다.
Builder(context: Context!, channelId: String!)
앱의 알림을 채널로 구분하겠다는 의도입니다. 26 버전 이전에서는 사용자가 환경설정에서 어떤 앱의 알람을 받을지 말지를 설정할 수 있습니다. 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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.0) {
val channelId = "one-channel"
val channelName = "My Channel One"
val channel = Notification Channel(
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)
}