안드로이드 17) Notification

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)

좋은 웹페이지 즐겨찾기