질문 정리

안드로이드 알림 구현(헤드업 알림 포함)

five2week 2024. 6. 17. 17:09

문제 상황

NotificationBuilder로 안드로이드 알림기능을 구현했는데, 카카오톡 알림처럼 화면 상단에 잠깐 떴다가 사라지는 알림은 생성되지 않았습니다. 당시에는 해당 알림의 이름도 몰라서 화면 상단에 뜨는 알림으로 검색을 했는데, 검색 결과 헤드업 알림이라는 것을 알게되었습니다. 그리고 헤드업 알림이 뜨지 않는 이유는 알림의 중요도를 적절하게 설정하지 않았기 때문이었습니다.

알림 중요도

채널 중요도는 채널에 게시된 모든 알림에 영향을 미칩니다. 제가 원하던 헤드업 알림을 위해서는 중요도를 IMPORTANCE_HIGH 로 설정해야했는데, 저는 IMPORTANCE_DEFAULT 로 설정했기 때문에 헤드업 알림이 표시되지 않았던 것입니다.

알림 중요도 설정 방법

Android 8.0(API 26) 버전 이상부터는 알림 구현을 위해 Channel 을 구현하게 됩니다. 따라서 NotificationChannel을 구성할 때 중요도 수준을 설정할 수 있습니다.

Android 7.1(API 25) 이하 버전에서는 NotificationCompat의 builder 를 설정하여 알림을 구현할 수 있습니다.

제가 진행하는 프로젝트의 경우는 최소 sdk 버전이 26이기 때문에, NotificationChannel 만을 이용해서 중요도 수준을 설정했습니다.

fun showErrorNotification(context: Context, channelId: String = CHANNEL_ID) {
    val notificationManager =
        context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    createNotificationChannel(notificationManager, channelId)

    val pendingIntent = createPendingIntent(context)
    val notification = buildNotification(context, channelId, pendingIntent)

    notificationManager.notify(NOTIFICATION_ID, notification)
}

private fun createNotificationChannel(
    notificationManager: NotificationManager,
    channelId: String
) {
    val channel =
        NotificationChannel(channelId, "Example", NotificationManager.IMPORTANCE_HIGH)
    notificationManager.createNotificationChannel(channel)
}

private fun createPendingIntent(context: Context): PendingIntent {
    val intent = Intent(context, ExampleActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }
    return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
}

private fun buildNotification(
    context: Context,
    channelId: String,
    pendingIntent: PendingIntent
): Notification {
    return NotificationCompat.Builder(context, channelId).apply {
        setContentTitle("Error Title")
        setContentText("Error Content")
        setSmallIcon(android.R.drawable.stat_notify_error)
        setPriority(NotificationCompat.PRIORITY_HIGH)
        setAutoCancel(true)
        setContentIntent(pendingIntent)
        setCategory(Notification.CATEGORY_MESSAGE)
    }.build()
}

private const val NOTIFICATION_ID = 7777
private const val CHANNEL_ID = "example"

안드로이드 13 버전 이상

추가적으로 안드로이드 버전이 13보다 높다면, 알림을 띄우기 위해서 POST_NOTIFICATIONS 권한이 필요합니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) !=
        PackageManager.PERMISSION_GRANTED) {

        // 사용자가 권한을 거부한 적이 있는지 확인
        if (ActivityCompat.shouldShowRequestPermissionRationale(context as Activity, Manifest.permission.POST_NOTIFICATIONS)) {
            ActivityCompat.requestPermissions(context, arrayOf(Manifest.permission.POST_NOTIFICATIONS), REQUEST_CODE)
        } else {
            // 처음으로 권한을 요청하거나 "다시 묻지 않음"을 선택하지 않았을 때
            ActivityCompat.requestPermissions(context, arrayOf(Manifest.permission.POST_NOTIFICATIONS), REQUEST_CODE)
        }
    } else {
        // 권한이 이미 허용되었을 때의 처리
    }
}

참고 링크

https://developer.android.com/develop/ui/views/notifications/channels?hl=ko&_gl=1*g7ozoo*_up*MQ..*_ga*MTUyMjk5MjcxOS4xNzA4NTcyMzU0*_ga_6HH9YJMN9M*MTcwODU3MjM1NC4xLjAuMTcwODU3MjM1NC4wLjAuMA..#importance

 

알림 채널 만들기 및 관리  |  Views  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 알림 채널 만들기 및 관리 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android 8.0 (API 수준 26)부터는

developer.android.com