[Android ]Notification

유민국·2023년 6월 23일
0

notification
create Notification

Notification Overview

애플리케이션의 실행을 유도할 수 있어서 굉장히 중요한 요소이다.

  • 사용자에게 시스템 이벤트, 앱 상태 또는 기타 정보를 제공한다.
  • 메시지는 상태 표시줄에 표시되며 알림을 탭하면 해당 앱이나 관련 작업으로 이동할 수 있게 한다.

기기에 표시되는 형식

  • 알림을 보내면 상태 표시줄에 아이콘으로 표시된다.
  • 사용자는 알림 창에서 세부정보를 보거나 작업을 할 수 있다.

특징

  • Notification은 애플리케이션과 별도로 관리되는 메시지 이다.
  • 알림은 앱 또는 사용자가 닫을 때까지 알림 창에 계속 표시된다.(단말기를 껏다 켜도 유지)

Head-up notification

간단한 예로 카카오톡 메시지 알림을 떠올려보자. 알림이 켜진 상태라면 다른 앱을 사용하는 도중에도 디바이스 상단에 메시지 알림이 도착하고, 몇 초뒤 메시지가 사라지는걸 볼 수 있다.

  • 플로팅 창에 알림을 간략히 표시할 수 있다.
  • 일반적으로 사용자가 즉시 알아야 하는 중요한 알림에 사용되며 기기가 잠금 해제될 때만 표시된다.
  • 알림을 보낸 순간 표시되어 잠시 후 사라지지만, 다른 알림과 마찬가지로 아림창에는 계속 표시된다.

headUp notification을 트리거할 수 있는 조건

  • 사용자의 활동이 전체 화면 모드인 경우(app이 fullScreenIntent를 사용하는 경우)

잠금화면에서의 알림

  • 잠금화면에서 app이 게시하는 알림의 세부정보를 프로그래매틱 방식으로 설정하거나 알림을 잠금 화면에 표시할 것인지를 설정할 수도 있다.
    -> 민감한 콘텐츠를 숨기는 경우를 말한다. 잠금화면에서 카톡 메시지는 설정을 통해 해당 대화 내용 대신 "???님의 메시지" 이런식으로 나오게 만들 수 있다.

앱을 실행시키기전에 잠금 해제 요청하기

  • setAuthenticationRequired(true) 설정

앱 아이콘 배지

  • 아이콘 위에 빨간점 같이 배지를 통해 해당 앱의 알림 정보를 확인할 수 있다.
  • 사용자는 앱 아이콘을 길게 눌러 해당 앱의 알림을 볼 수 있고, 알림을 닫거나 알림에서 작업을 할 수 있다.

알림 구성

  • 알림의 디자인은 시스템 템플릿에 의해 결정되며, 앱에서는 각 부분에 해당하는 콘텐츠만 정의할 수 있다. 알림의 일부 세부정보는 알림 창을 확장 했을 때만 볼 수 있다.
  • 모든 기기에서 적절한 디자인 호환성을 보장하도록 시스템 템플릿을 사용하는 것이 좋지만, 필요하다면 Custom이 가능하다.
  1. Small icon : 필수 구성요소. setSmallIcon() 을 통해 설정
  2. App name : App 이름. 알림에서 설정하지 않음
  3. Time stamp : 시스템에서 제공. setWhen() 을 사용하여 재정의 하거나 setShowWhen(false) 로 숨길 수 있음.
  4. Large icon : 선택사항(일반적으로 사진을 표시하는게 아니라면 사용하지 않음). setLargeIcon() 을 통해 설정
  5. Title : 선택사항. setContentTitle() 을통해 설정
  6. Text : 선택사항. setContentText() 를 통해 설정

알림 작업

  • 모든 알림은 탭했을 때 적절한 앱 활동이 실행되어야 한다.
  • 기본 알림 작업 외에도 알림에서 작업 버튼을 추가해서 직접 메시지에 답장을 하거나 다른 텍스트를 입력하는 작업도 할 수 있다.

알림 채널

8.0 이전에는 앱의 알림 on/off만 있었지만 현재는 앱의 알림을 개별적인 채널로 관리할 수 있어 해당 채널에 알림을 on/off 할 수 있다.

알림 중요도 설정

  • 알림의 중요도를 설정하여 알림이 사용자를 시각적 또는 청각적으로 방해(헤드업 알림이 나타나거나, 알림음이 있다거나 등)하는 수준을 결정할 수 있다.
  • 알림의 중요도는 알림이 게시된 채널의 inportrance에 따라 결정되며, 사용자는 시스템 설정에서 해당 알림 채널의 중요도를 변경할 수 있다.

가능한 중요도 수준

모든 알림은 알림 창 및 배지와 같이 사용자를 방해하지 않는 경우는 표시된다.
알림 배지 수정

  • Urgent : 알림음이 울리며 헤드업 알림을 표시 된다.
  • High : 알림음이 울린다.
  • Medium : 알림음이 울리지 않는다.
  • Low : 알림음이 울리지 않으며 상태 표시줄에 표시되지 않는다.

알림 업데이트 하기

  • 알림이 업데이트되어 사용자에게 여러번 알림이 가서 불편을 주지 않으려면 새로운 알림을 보내는 것이 아닌, 기존 알림을 업데이트하거나 inbox-style을 사용하여 대화형 업데이트를 표시하는 방법을 고려해본다.
  • 만약 카톡메시지 처럼 여러번 알림을 보내야 하는 경우에는 하나의 그룹으로 만드는 방법을 사용하도록 한다. 알림 그룹을 사용하면 여러 알림을 하나의 알림처럼 축소시킬 수 있으며, 알림을 펼쳐서 개별 알림의 세부정보를 확인할 수 있다.

확장 가능한 알림 만들기

링크

알림 그룹 만들기

링크

Channel

안드로이드 8.0 부터 새롭게 추가된 기능
이전에는 사용자가 설정에서 알림 메시지를 비활성화 하면 모든 메시지가 비활성화 되었다.
8.0 부터는 Notification Channel을 이용하여 알림 메시지를 채널이라는 그룹으로 묶어 관리할 수 있으며 사용사는 채널 별로 메시지 활성화 여부를 설정할 수 있다.

권한 문제

확인할 권한
안드로이드 13버전 부터는 Notification 사용을 위해
POST_NOTIFICATIONS 권한을 사용자로부터 확인 받아야 한다.

val permissionList = arrayOf(
    Manifest.permission.POST_NOTIFICATIONS
)

getNotificationBuilder

setContentTitle("Notification 1")
setContentText("알림 메시지1 입니다")
setSmallIcon(android.R.drawable.ic_menu_search)
setAutoCancel(true) : 메시지를 터치하면 자동으로 메시를 제거 한다.
setContentIntent(pendingIntent1)

custom method

// Notification Channel을 등록하는 메서드
// id : 코드에서 채널을 관리하기 위한 이름
// name : 사용자에게 노출 시킬 이름
fun addNotificationChannel(id:String, name:String){
    // 안드로이드 8.0 이상일 때만 동작하게 한다.
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        // 알림 메시지를 관리하는 객체를 추출한다.
        val notificationManger = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        // id를 통해 NotificaitonChannel 객체를 추출한다.
        // 채널이 등록된 적이 없다면 null을 반환한다.
        // 등록된 적이 있는지 없는지 확인하기 위해 channel 선언
        val channel = notificationManger.getNotificationChannel(id)
        // 채널이 등록된 적이 없다면,
        if(channel == null){
            // 채널 객체를 생성한다.
            // IMPORTANCE_HIGH : 중요도에 따라 설정, HIGH로 설정함
            val newChannel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH)
            // 단말기에 LED 램프가 있다면 램프를 사용하도록 설정한다.
            newChannel.enableLights(true)
            // LED 램프의 색상을 설정한다.
            newChannel.lightColor = Color.RED
            // 진동을 사용할 것인가
            newChannel.enableVibration(true)
            // 채널을 등록한다.
            notificationManger.createNotificationChannel(newChannel)
        }
    }
}
// Notification 메시지 관리 객체를 생성하는 메서드
// Notification 채널 id를 받는다.
fun getNotificationBuilder(id:String) : NotificationCompat.Builder{
    // 안드로이드 8.0 이상이라면
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        val builder = NotificationCompat.Builder(this, id)
        return builder
    } else {
        val builder = NotificationCompat.Builder(this)
        return builder
    }
}

예시

// NotificationBuilder를 가져온다.
val builder = getNotificationBuilder(NOTIFICATION_CHANNEL1_ID)
// 작은 아이콘
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 1")
// 메시지 설정
builder.setContentText("Content Text 1")

// 메시지 객체를 생성한다.
val notification = builder.build()
// 알림 메시지를 관리하는 객체를 추출한다.
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
// 메시지를 표시한다.
// 첫번째 매개변수에 넣어주는 정수는 단말기 전체에서 메시지를 구분하기 위한 값
// 값은 값으로 메시지를 계속 보여주면 메시지가 갱신 것이고
// 다른 값으로 메시즈를 계속 보여주면 메시지가 각각 따로 나타난다.
notificationManager.notify(10, notification)

PendingIntent

소개

Notification 메시지를 통해 애플리케이션의 Activity를 실행할 수 있으며 이 때 Pending Intent를 사용한다.
Pending Intent를 통해 실행되는 Activity로 데이터를 전달 할 수 있다.

  • 메시지를 터치하면 Activity가 실행되도록 한다.
val newIntent = Intent(this@MainActivity, Notification1Activity::class.java)
val pendingIntent1 = PendingIntent.getActivity(this@MainActivity, 10, newIntent,
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
builder.setContentIntent(pendingIntent1)

Action

알림 메시지에 Button과 같은 것을 배치하여 이를 눌렀을 때 지정된 Activity를 실행할 수 있다.
안드로이드 4.0 까지는 메시지당 하나의 Activity만 실행이 가능했지만 4.1 이후로 Action이 제공되어 하나의 메시지에서 여러 Activity를 선택적으로 실행할 수 있게 되었다.

// Action 설정
val newIntent2 = Intent(this@MainActivity, Notification2Activity::class.java)
newIntent2.putExtra("data3", 200)
newIntent2.putExtra("data4", "반갑습니다")

val pendingIntent2 = PendingIntent.getActivity(this@MainActivity, 100,
    newIntent2, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)

// Action을 생성한다.
// 첫 번째 : 아이콘 설정
// 두 번째 : 표시할 문자열
// 세 번째 : PendingIntent
val builder2 = NotificationCompat.Action.Builder(
    android.R.drawable.ic_dialog_alert, "Action", pendingIntent2)
val action2 = builder2.build()
builder.addAction(action2)

다양한 Notification

안드로이드 4.1에 새롭게 추가된 부분으로 4.0 이하 버전에서는 기본 알림 메시지로 표시된다.
안드로이드 4.1 이후 부터는 알림 메시지를 접었다 폈다 하면서 부가 정보를 표시할 수 있다.

Big Picture Style

  • 메시지를 펼쳤을 때 이미지를 표시할 수 있다.
// BigPicture 설정
val big = NotificationCompat.BigPictureStyle(builder)
// 보여줄 이미지를 설정한다.
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.img_android)

big.bigPicture(bitmap)
big.setBigContentTitle("Big Content Title")
big.setSummaryText("Summary Text")

Big Text Style

메시지를 펼쳤을 때 장문의 문자열을 표시할 수 있다.

// Big Text 설정
val big = NotificationCompat.BigTextStyle(builder)
big.setBigContentTitle("Big Content Title")
big.setSummaryText("Summary Text")
big.bigText("""동해물과 백두산이
    |마르고 달도록
    |하느님이 보우하사
    |우리나라 만세
""".trimMargin())

InBox Style

메시지를 펼쳤을 때 문자열 들을 표시할 수 있다.

// InBox 설정
val inbox = NotificationCompat.InboxStyle(builder)
inbox.setSummaryText("Summary Text")
inbox.setBigContentTitle("InBox Style")

inbox.addLine("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
inbox.addLine("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
inbox.addLine("ccccccccccccccccccccccccccccccccccccccc")
inbox.addLine("ddddddddddddddddddddddddddddddddddddd")
inbox.addLine("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
inbox.addLine("ffffffffffffffffffffffffffffffffffffffff")
inbox.addLine("gggggggggggggggggggggggggggggggggggggggggg")

Message Notification

안드로이드 9.0에서 새롭게 추가된 Notification
다자간의 메시지 내용을 표시하는 용도로 사용한다.

profile
안녕하세요 😊

0개의 댓글