반응형
Notification
- 애플리케이션과 별도로 관리되는 메시지
- Notification은 OS에게 요청하는 것 -> OS 는 알림창 영역에 알림 메시지 표시
- 주로 화면을 가지지 않는 실행 단위에서 메시지를 표시할 때 사용됨
- 사용자가 메시지를 확인하거나 제거하기 전까지 유지됨
- 메시지를 터치하면 지정된 Activity가 실행되어 애플리케이션 실행을 유도
- 안드로이드 8.0(SDK) 이전 -> 사용자가 앱의 알림 설정을 끄면 모든 메세지 비활성화 / 8.0 부터 -> Notofication Channel을 이용해 알림 메시지를 채널이라는 그룹으로 묶어 관리할 수 있으며 사용자는 채널 별로 메시지 활성화 여부 설정이 가능 (앱 단위 관리 -> 채널 단위 관리)
binding.button.setOnClickListener {
//var builder = NotificationCompat.Builder(this) -> 8.0 이상은 채널 매개변수가 하나 더 있음
val builder = getNotificationBuilder("channel1", "첫번째 채널")
// 메세지 아이콘
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")
builder.setContentText("Content Text")
// 메세지 객체를 설정
val notification = builder.build()
// 알림 메시지를 관리하는 객체를 추출
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// 알림 메시지 출력
manager.notify(10, notification) // id : 메세지를 표시하는 자리, 이 id가 같으면 이 자리에 계속 덮어씌워져서 메시지가 나타남 (채널 id와는 다르다!)
}
- notify() 메서드의 id 를 동일하게 설정하면 계속 같은 자리에 메세지가 나타나기 때문에 이전 메세지는 덮어씌워짐
- 채널을 다르게 설정해서 메세지 알림을 채널별로 관리할 수 있음 *채널이 달라도 notify()의 id가 동일하면 같은 자리에 메세지 나옴
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) // 뷰바인딩 객체
val view = binding.root //뷰바인딩을 통해 레이아웃과 뷰가 결합 -> .root 를 통해 View 객체만를 뽑아내는(?)
setContentView(view)
/* 메세지를 표시하는 자리를 다르게 표시 */
binding.button3.setOnClickListener {
//var builder = NotificationCompat.Builder(this) -> 8.0 이상은 채널 매개변수가 하나 더 있음
val builder = getNotificationBuilder("channel1", "첫번째 채널")
// 메세지 아이콘
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")
builder.setContentText("Content Text")
// 메세지 객체를 설정
val notification = builder.build()
// 알림 메시지를 관리하는 객체를 추출
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// 알림 메시지 출력
manager.notify(30, notification) // id : 메세지를 표시하는 자리, 이 id가 같으면 이 자리에 계속 덮어씌워져서 메시지가 나타남 (채널 id와는 다르다!)
}
/* 채널을 다르게 설정 */
binding.button4.setOnClickListener {
//var builder = NotificationCompat.Builder(this) -> 8.0 이상은 채널 매개변수가 하나 더 있음
val builder = getNotificationBuilder("channel2", "두번째 채널")
// 메세지 아이콘
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 Title4")
builder.setContentText("Content Text4")
// 메세지 객체를 설정
val notification = builder.build()
// 알림 메시지를 관리하는 객체를 추출
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// 알림 메시지 출력
manager.notify(40, notification) // id : 메세지를 표시하는 자리, 이 id가 같으면 이 자리에 계속 덮어씌워져서 메시지가 나타남 (채널 id와는 다르다!)
}
}
// 안드로이드 8.0 이상 버전에 대응하기 위한 notification 채널을 설정하는 메서드
fun getNotificationBuilder(id:String, name:String) : NotificationCompat.Builder {
// 알림 메시지에 필요한 NotificationCompat.Builder 객체를 만들어 반환
// id : 각 채널을 내부적으로 관리하기 위해 사용하는 id 이름
// name : 사용자에게 보여줄 채널의 이름
// os 버전별로 분기
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //Ores -> 8.0
// 알림 메시지를 관리하는 객체를 추출 (시스템 서비스 관리자 -> 알림 관리 객체 추출)
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// channel 객체를 생성
val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH) // 알림 중요도 (높을수록 여러 상황에 대응이 편리!)
// 메시지 출력시 단말기 LED를 사용할 것인가?..
channel.enableLights(true)
channel.lightColor = Color.RED // LED 색상 설정
// 메시지 알림 받을 때 진동 사용 여부
channel.enableVibration(true)
// 알림 메시지를 관리하는 객체에 채널을 등록
manager.createNotificationChannel(channel)
val builder = NotificationCompat.Builder(this,id)
return builder
} else {
val builder = NotificationCompat.Builder(this)
return builder
}
}
반응형
'Android' 카테고리의 다른 글
[안드로이드/Error] PendingIntent.FLAG_UPDATE_CURRENT 오류 (0) | 2023.04.14 |
---|---|
[안드로이드/메시징] Pending Intent (0) | 2023.04.13 |
[안드로이드/메시징] Dialog (0) | 2023.04.10 |
[안드로이드/메시징] SnackBar (0) | 2023.04.04 |
[안드로이드/메시징] Toast (0) | 2023.03.31 |