Android
[Android/Kotlin] 상태바 알림(Notification), 채널(Channel)
haehyun
2022. 1. 5. 17:22
728x90
상태 바
상태 바는 화면 상단에 현재 시간, 네트워크, 배터리 정보 등을 표시하는 공간으로써 원래 시스템이 관리하는 곳이기 때문에 앱이 직접 제어할 수 없는 영역이다. 그러나 우리는 알림을 위해 제공하는 API를 이용해 각종 앱에서 푸시 알림을 수신할 수 있다.
알림 채널(Channel)
API 레벨 26버전(Oreo) 부터 추가된 개념, 앱의 알림을 카테고리(채널)별로 구분할 수 있도록 한다.
이전까지는 하나의 앱에 대해서 1. 알림 받기 / 2. 알림 받지 않기 두 가지 밖에 설정할 수 없었지만, 채널 개념이 생기고부터는 하나의 앱이 발생시키는 알림들 중 특정 알림만 선택적으로 받는 것이 가능해졌다.
[설정] → [애플리케이션] → [애플리케이션 정보] → [알림] 으로 들어가면 채팅 알림, 키워드 알림, 서비스 알림 등 알림이 세분화되어 있으며 각각의 항목에 대해 개별적으로 알림받기를 설정할 수 있다.
알림 생성 과정
1. 기기 버전 체크
Channel 자체가 SDK 26 부터 생긴 개념이기 때문에 이전 버전에서는 Channel로 알림을 표시하지 않는다. 앱 호한성을 고려해 버전 체크후 두가지 방식으로 알림 표시 작업 수행
- SDK 26 이상 → 채널 사용 O
- SDK 26 미만 → 채널 사용 X
2. NotificationChannel
- NotificationChannel 채널 생성
- NotificationChannel setter 함수로 채널 정보 설정 (채널 설명문, 배지 알림음, 불빛, 진동 등)
- NotificationManager에 채널 등록
3. NotificationCompat.Builder
- NotificationChannel의 channelId로 NotificationCompat.Builder 생성
- NotificationCompat.Builder setter 함수로 알림 정보 설정 (스몰 아이콘, 알림 시각, 제목, 내용)
4. Notification
- NotificationComapt.Builder로 Notification 객체 생성
5. NotificationManager
- Notification객체를 매개변수로 NotificationManager.notify() 함수 실행
소스 코드
[MainActivity.kt] - 앱 실행 시 푸시알림 표시
package com.example.androidlab
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.graphics.Color
import android.media.AudioAttributes
import android.media.RingtoneManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.NotificationCompat
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 알림
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
val builder: NotificationCompat.Builder
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// 채널 생성
val channelId = "one-channel"
val channelName = "My Channel One"
val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT)
// 채널 정보 설정
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)
// 채널 Id로 NotificationCompat.builder 생성
builder = NotificationCompat.Builder(this, channelId)
} else {
builder = NotificationCompat.Builder(this)
}
// 알림 정보 설정
builder.setSmallIcon(android.R.drawable.ic_notification_overlay) // 스몰 아이콘
builder.setWhen(System.currentTimeMillis()) // 알림 시각
builder.setContentTitle("Content Title") // 타이틀
builder.setContentText("Content Massage") // 내용
val notification: Notification = builder.build()
manager.notify(11, notification)
}
}
728x90