Android Notification 생성하기

 

지난 시간에 AlarmManager 를 활용한 데이터 가져오기를 구현했으니, 이제 Notification 을 통해 사용자에게 문제를 풀라는 알림을 보내는 기능만 남았다. 

 

먼저 Android 에서 Notification 의 UI 구조에 대해서 살펴보자

 

Android Notification 구조

필수 구성요소 선택사항

 

  1. 작은 아이콘 : setSmallIcon()을 통해 설정됨
  2. 앱 이름: 시스템에서 제공한다.
  3. 타임스탬프 : 시스템에서 제공하지만 setWhen() 을 사용하여 재정의하거나 setShowWhen(false) 로 숨길 수 있음
  4. 큰 아이콘:  선택사항이며 setLargeIcon()을 통해 설정된다.
  5. 제목: setContentTitle()을 통해 설정된다
  6. 텍스트: 선택사항이며 setContentText()를 통해 설정된다.

간단한 노티피케이션을 구성할거면 시스템에서 제공하는 UI 를 사용하면 되지만, 직접 커스텀한 레이아웃을 Notification에 적용할 수도 있다.

 

 

기본적인 알림 만들어보기


우선 기능 구현에 앞서 먼저 테스트를 통해 Notification 에 대해 자세히 알아보자. Notification 은 빌더를 사용해서 생성할 수 있다.

코드를 살펴보자

 

Builder 를 사용한 알림 생성

var builder = NotificationCompat.Builder(context, "test")
    .setSmallIcon(R.drawable.app_logo)
    .setContentTitle("테스트용입니다")
    .setContentText("문제를 좀 푸세요")
    .setPriority(NotificationCompat.PRIORITY_DEFAULT)

 

NotificationCompat의 빌더를 호출하여, 각 구성요소를 설정하게 된다. 이 때 중요한 게 채널 ID 를 제공해야 한다는 것이다. Android 8.0 (API 26) 이상부터는 노티피케이션 생성 시 채널 ID 를 제공해야 하는데, API 26 이전 버전에서는 무시되기 때문에 버전에 따라 분기할 필요가 없이 채널 ID 를 제공해주면 된다.

 

채널 생성하기

이제 위에서 채널 ID로 정해준 채널을 생성해야 한다. 채널은 API 26 이상 버전부터만 사용되기 때문에, 채널 생성 시에 버전에 따라 분기해 야 한다. 채널 생성 방법은 다음과 같다.

 

 

//API 레벨 26이상일 때만 채널을 생성함
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val channelName = context.getString(R.string.channel_name)
    val descriptionText = context.getString(R.string.description_text)
    val importance = NotificationManager.IMPORTANCE_DEFAULT
    val channel = NotificationChannel(CHANNEL_ID, channelName, importance).apply {
        description = descriptionText
    }
   val notificationManager =
        context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.createNotificationChannel(channel)
}

 

API 레벨 26 이상일 때만 Notification Channel을 생성하도록 했다.

Channel 을 반복적으로 만들어도 기존에 채널이 이미 존재하면 아무 동작도 하지 않기 때문에, 이 코드를 반복적으로 호출하는게 안전하다고 구글에서 가이드를 주고 있다.

 

채널 생성에 필요한 요소는 3 가지로, 채널의 고유 ID (String), 채널의 이름 (String), 채널의 설명(String) 이다. 고유한 값을 만들어 채널을 생성해보자.  그다음 System 에서 Notification Manager 를 불러와 채널을 생성해주면 된다.

 

알림 클릭 이벤트 설정

모든 알림은 클릭 이벤트가 존재해야 한다. 알림을 클릭했는데 아무 이벤트도 일어나지 않는다면 당황스러울 것이다. 알림은 현재 어플리케이션이 아닌 Android 시스템에서 관리하기 때문에, PendingIntent 를 생성해 클릭 시 실행할 인텐트를 지정해줘야한다.

 

다음과 같은 코드로 PendingIntent 를 생성하여 Notification Builder 에게 넘겨주자

 

var builder = NotificationCompat.Builder(context, "test")
    .setSmallIcon(R.drawable.app_logo)
    .setContentTitle("테스트용입니다")
    .setContentText("문제를 좀 푸세요")
    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
    .setContentIntent(createPendingIntent())


fun createPendingIntent(): PendingIntent =
    Intent(context, MainActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }.let { intent ->
        PendingIntent.getActivity(context, CLICK_REQUEST, intent, 0)
    }

 

알림 표시

이제 알림을 직접 표시해보자. 알림은 NotificationManagerCompat.notify() 함수를 호출해 표시할 수 있다. 알림의 고유 ID 와  Builder 의 build() 결과를 전달해야 한다.

 

var builder = NotificationCompat.Builder(context, "test")
    .setSmallIcon(R.drawable.app_logo)
    .setContentTitle("테스트용입니다")
    .setContentText("문제를 좀 푸세요")
    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
    .setContentIntent(createPendingIntent())

with(NotificationManagerCompat.from(context)) {
    notify(123, builder.build())
}

여기서 Notification 의 고유한 ID 를 전달해줘야하는데, 이는 나중에 알림을 업데이트하거나 삭제할 때 필요하기 때문이다.

이제 버튼을 클릭해 직접 노티피케이션을 생성해보았다.

 

아주 잘된다!

 

 

Notification Icon 만들기


 

다 잘되서 이제 개발을 마무리 지어야 하는데, 위와 같이 small Icon 으로 넣어준 앱 로고가 제대로 나오지 않고 회색 배경으로 나오는 현상을 발견했다.

 

알고보니 노티피케이션 아이콘도 Android Image Asset 을 이용해 생성해야 하는데, 또 생성할 때 가이드를 따라야 한다.

 

가이드는 다음과 같다.

 

  • 투명한 배경을 가지는 png 파일이어야 한다.
  • 로고 부분은 흰색 (255,255,255) 픽셀로만 이루어져야 한다.

 

Adobe XD 를 활용해 위 가이드를 만족하는 이미지를 만들어 Image Asset 에 넣어 보았다.

 

 

정상적으로 AC 로고가 출력되는 것을 볼 수 있었다. 참고로 위 가이드를 만족하지 않는 이미지를 생성하려 한다면, 다음과 같이 뜬다.

 

 

위 Small Icon 을 적용해 정상적으로 Icon 이 출력되는 것을 확인했다.

 

[참고]

https://developer.android.com/training/notify-user/build-notification?hl=ko

 

'개발 > 백준 프로필' 카테고리의 다른 글

AlarmManager 를 이용한 프로필 업데이트  (1) 2022.01.12