Concepts of Notification
1. Notification
- 상태바(Status Bar)에 앱의 상태를 출력해 유저에게 무언가의 상황을 알려주는 기능을 Notification이라고 한다.
- 상태바는 시스템의 코어 정보를 뿌리기 위한 창으로 시스템에 의해 관리되는 곳이다. 즉, 앱에서 제어할 수 없는 곳이다.
- 보통 Activity보다는 BroadcastReceiver나 Service 컴포넌트를 실행하다가 유저에게 알려줄 상황이 있을 때 사용한다.
2. Notification 사용 방법
- 알림은 NotificationManager의 notify() 함수 실행시 Status Bar에 Notification이 발생
- Notification의 내용을 가지는 Notification 객체는 NotificationCompat.Builder에 의해 생성
- NotificationCompat.Builder는 NotificationChannel에 의해 생성
- Builder를 생성하는 방법이 API Level 26(Android 8) 버전부터 변경
NotificationManager
1. Notification.Builder
- API Level 26 이전 버전 : Builder(context: Context!)
- API Lever 26 버전 부터 : Builder(context: Context!, channelId: String!)
- NotificationChannel 정보를 줘야 함
- Channel : 애플리케이션의 환경설정에서 애플리케이션에서 띄우는 Notification을 구분하는 것(알림이 여러가지일 때 각 알림을 구분)
2. NotificationChannel
- NotificationChannel(id: String!, name: CharSequence!, importance: Int)
- importance 매개변수
- NotificationManager.IMPORTANCE_HIGH : 긴급 상황이며 알림음이 울리며 헤드업(상태바가 아니고 다이얼로그처럼 상단에 띄워져 있음)으로 표시
- NotificationManager.IMPORTANCE_DEFAULT : 높은 중요도이며 알림음이 울림
- NotificationManager.IMPORTANCE_LOW : 중간 중요도이며 알림음이 울리지 않음
- NotificationManager.IMPORTANCE_MIN : 낮은 중요도이며 알림음이 없고 상태표시줄에 표시되지 않음
3. Notification
- Notification은 알림에 출력될 이미지, 문자열 등의 정보를 담는 객체
builder.setSmallIcon(android.R.drawable.ic_notification_overlay)
builder.setWhen(System.currentTimeMillis())
builder.setContentTitle("Content Title")
builder.setContentText("Content Message")
- Builder에게 setter 함수로 명령을 내리면 setter 함수의 정보대로 Notification 객체를 만들어 준다.
Notification 구성
1. Touch Event
- 유저가 Notification을 터치했을 때 이벤트 발생, 대부분 앱의 컴포넌트를 실행
- static fun getActivity(context: Context!, requestCode: Int, intent: Intent!, flags: Int): PendingIntent!
- static fun getBroadcast(context: Context!, requestCode: Int, intent: Intent!, flags: Int): PendingIntent!
- static fun getService(context: Context!, requestCode: Int, intent: Intent!, flags: Int): PendingIntent!
- 이벤트가 시스템에서 발생(Notification은 시스템)해서 Intent를 띄우는 것(Component 실행 위해)을 시스템에서 함
- 시스템은 개발자가 조작할 수 없으므로 위의 함수들로 이벤트가 발생했을 때 Intent를 띄워달라고 의뢰
- PendingIntent는 인텐트 정보를 가지고 있지만 아직 발생하지 않은 인텐트로 시스템에 등록시 시스템에서 실제 이벤트가 발생했을 때 인텐트를 발생
val intent = Intent(this, DetailActivity::class.java)
val pendingIntent = PendingIntent.getActivity(this, 10, intent, PendingIntent.FLAG_UPDATE_CURRENT)
builder.setContentIntent(pendingIntent)
- 인텐트는 개발자가 준비
- 인텐트 발생을 시스템에 의뢰하기 위해 인텐트 정보를 매개변수로 가지는 getActivity 함수 사용
- Notification을 만드는 빌더에 pendingIntent를 매개변수로 가지는 setContentIntent(컨텐츠를 터치했을 때 이벤트를 등록) 함수 사용
2. 액션
- 알림에 최대 3개까지의 유저 이벤트를 위한 액션(Notification 하단에 들어가는 일종의 버튼)을 추가
- 마찬가지로 이벤트를 등록하고 인텐트를 발생시켜 컴포넌트를 실행시켜야 함, 인텐트를 액션에 등록해서 시스템에 의해 발생되도록 함
val actionIntent = Intent(this, DetailActivity::class.java)
val actionPendingIntent = PendingIntent.getActivity(this, 20, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT)
builder.addAction(
NotificationCompat.Action.Builder)
android.R.drawable.stat_notify_more,
"Action",
actionPendingIntent
).build()
)
3. Progress
- 알림을 이용해 일의 진행 상황을 보여줌
- setProgress() 함수 이용
builder.setProgress(100, 0, false)
manager.notify(11, builder.build())
thread {
for (i in 1..100){
builder.setProgress(100, i, false)
manager.notify(11, builder.build())
SystemClock.sleep(100)
}
}
4. Style
- BigPictureStyle : Notification에 큰 이미지를 출력
- BigTexteStyle : Notification에 많은 글을 출력
- InboxStyle : Notification에 일종의 목록 같은 것을 출력
- MessageStyle : Notification에 Message 정보(아이콘, 이름, 내용) 출력
val bigPicture = BitmapFactory.decodeResource(resources, R.drawable.logo_1)
val bigStyle = NotificationCompat.BigPictureStyle()
bigStyle.bigPicture(bigPicture)
builder.setStyle(bigStyle)