만족

[Android] Notification 본문

[Android] Notification

FrontEnd/Android Satisfaction 2021. 4. 19. 03:52

Notification을 생성하는 단계

1. Notification Channel 생성

2. Notification Builder로 Notification 생성

3. Notification Service에 Notification Channel과 Notification 등록

 

일단 전체 코드부터 보고, 하나씩 설명하겠다.

 

class NotificationActivity: AppCompatActivity(){
//...
	fun makeNotification() {
        //create notification Channel
        val nId = "MyChannel"
        val nName = "TimeCheckChannel"

        val nChannel = NotificationChannel(nId, nName, NotificationManager.IMPORTANCE_DEFAULT)
        nChannel.enableVibration(true)
        nChannel.enableLights(true)
        nChannel.lightColor = Color.BLUE
        nChannel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE

        //build notification
        val builder = NotificationCompat.Builder(this, nId)
            .setSmallIcon(R.drawable.ic_baseline_access_alarm_24)
            .setContentTitle("일정 알림")
            .setContentText(message)
            .setAutoCancel(true)
        val notification = builder.build()

        //register notification channel/notification to notification service
        val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        manager.createNotificationChannel(nChannel)

        val notificaitonId= 10
        manager.notify(notificaitonId, notification)
    }
}

 

Notification Channel 생성

        //create notification Channel
        val nId = "MyChannel"
        val nName = "TimeCheckChannel"

        val nChannel = NotificationChannel(nId, nName, NotificationManager.IMPORTANCE_DEFAULT)
        nChannel.enableVibration(true)
        nChannel.enableLights(true)
        nChannel.lightColor = Color.BLUE
        nChannel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE

 

Notification Channel은 "Notification의 대분류"로 보면 된다.

 

같은 채널(분류)에 존재하는 Notification들은 모두 같은 진동여부/라이트 색상/중요도를 갖는다.

 

NotificationChannel의 생성자에서

channelId, channelName, importance를 받는다.

 

channelId는 문자열 값으로 채널의 고유 번호이다.

channelName은 사용자에게 표시되는 채널의 이름이다.

 

importance는 알림의 중요도로, 알림이 가장 높으면 소리/진동/표시가 동시에 일어나고,

가장 낮으면 사용자에게 아무런 알림 신호를 주지 않고 알림 센터에 쌓인다.

 

Notification Channel은 Orea(API 26)부터 지원 및 강요되는 API이므로,

만약 targetAPI가 26 미만이라면 if문을 사용하여 걸러주어야 한다.

android.os.Build.VERSION.SDK //현재 Device의 API LEVEL

 

Notification Builder로 Notification 생성

        val nId= "MyChannel"
        //...
        
        //build notification
        val builder = NotificationCompat.Builder(this, nId)
            .setSmallIcon(R.drawable.ic_baseline_access_alarm_24)
            .setContentTitle("일정 알림")
            .setContentText(message)
            .setAutoCancel(true)
        val notification = builder.build()

 

val notification = Notification()으로 직접 생성하는 생성자는 Deprecated되었다.

 

Builder를 이용해 유도해내야 한다.

 

NotificationCompat.Builder(this, nId)

NotificationCompat.Builder의 두 번째 생성자 매개변수를 보면 channel id를 받는다.

 

이는 이 Notification이 추후 속하게 될 Notification Channel의 id와 일치시켜주면 되고,

마찬가지로 targetAPI가 26미만이라면 NotificationCompat.Builder(this) 처럼 channel id를 요구하지 않는 생성자를 이용한다.

 

NotificationCompat.Builder의 메소드는 메서드 체이닝이 가능하므로,

원하는 속성들 (제목, 내용, 아이콘 등)을 모두 설정하고,

해당 Builder 인스턴스의 build()를 사용해 Notificaiton 객체를 얻는다.

 

Notification Service에 Notification Channel과 Notification 등록

        //register notification channel/notification to notification service
        val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        manager.createNotificationChannel(nChannel)

        val notificaitonId= 10
        manager.notify(notificaitonId, notification)

 

준비된 Notification Channel과 Notification을 시스템 서비스에 등록한다.

 

마찬가지로 Notification Channel은 Oreo 아래에서 실행되지 못하도록 if로 필터링해준다.

 

특이한 점은 notificationId를 Notification 객체에서 추가하지 않고,

Notification Service에 등록할 때 추가한다는 것이다.

 

추후 이 id는 특정 알림을 취소한다거나 할 때 사용한다.

 

만약 Notification 클릭 시 특정 액티비티를 열고 싶다면?

        val intent = Intent(applicationContext, PendingIntentActivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP

        val pIntent = PendingIntent.getActivity(
            applicationContext,
            1,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT
        )
        builder.setContentIntent(pIntent)

        val notification = builder.build()

PendingIntent라는 것을 사용해 Notification에 setContentIntent로 설정한다.

 

이렇게 하면 알림 클릭 시 Intent에서 지정한 Activity가 열린다.

 

말 그대로 Intent를 Notification에 pending 하는 것이다.

 

주의할 점은 반드시 builder를 build() 하기 전에 setContentIntent() 해야 한다.

 

그렇지 않으면 set되지 않은 builder로 이미 Notification이 build()되어 아무런 행동도 하지 못한다.



Comments