The Android Developer Challenge is back! Submit your idea before December 2.

알림 채널 만들기 및 관리

Android 8.0(API 레벨 26)부터는 모든 알림을 채널에 할당해야 합니다. 채널마다 채널의 모든 알림에 적용되는 시각적/음향적 동작을 설정할 수 있습니다. 그런 다음 사용자는 이 설정을 변경하고 앱에서 차단하거나 표시해야 하는 알림 채널을 결정할 수 있습니다.

Android 8.0의 채널 및 기타 새로운 알림 기능의 개요는 아래 동영상을 확인하세요.

Android 8.0 기능을 포함하여 알림을 사용하는 샘플 코드는 Android 알림 샘플을 참조하세요.

그림 1과 같이 시스템 설정에서 앱별로 알림 채널을 사용자 설정할 수 있습니다.

그림 1. 시계 앱의 알림 설정 및 채널

알림 채널을 만든 후에는 알림 동작을 변경할 수 없습니다. 이 시점에서는 사용자가 모든 동작을 제어합니다. 그러나 채널의 이름과 설명은 변경할 수 있습니다.

보내야 하는 고유한 유형의 알림마다 채널을 만들어야 합니다. 앱 사용자의 선택을 반영하는 알림 채널을 만들 수도 있습니다. 예를 들어 메시지 앱에서 사용자가 생성하는 대화 그룹마다 별도의 알림 채널을 설정할 수 있습니다.

Android 8.0(API 레벨 26)을 타겟팅하는 경우 알림 채널을 하나 이상 구현해야 합니다. targetSdkVersion이 25 이하로 설정된 경우 앱은 Android 8.0(API 레벨 26) 이상에서 실행될 때 Android 7.1(API 레벨 25) 이하를 실행하는 기기에서와 동일하게 작동합니다.

알림 채널 만들기

알림 채널을 만들려면 다음 단계를 따르세요.

  1. 고유한 채널 ID, 사용자가 볼 수 있는 이름, 중요도 수준을 사용하여 NotificationChannel 개체를 구성합니다.
  2. 선택적으로 setDescription()을 사용하여 시스템 설정에서 사용자에게 표시되는 설명을 지정합니다.
  3. 알림 채널을 createNotificationChannel()에 전달하여 등록합니다.

Kotlin

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        // Create the NotificationChannel
        val name = getString(R.string.channel_name)
        val descriptionText = getString(R.string.channel_description)
        val importance = NotificationManager.IMPORTANCE_DEFAULT
        val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
        mChannel.description = descriptionText
        // Register the channel with the system; you can't change the importance
        // or other notification behaviors after this
        val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(mChannel)
    }
    

자바

    private void createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.channel_name);
            String description = getString(R.string.channel_description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
    

원래 값으로 기존 알림 채널을 만들면 아무 작업도 실행되지 않으므로 앱을 시작할 때 이 코드를 호출하는 것이 안전합니다.

기본적으로 이 채널에 게시되는 모든 알림에서는 IMPORTANCE_DEFAULTIMPORTANCE_HIGH와 같이 NotificationManagerCompat 클래스의 중요도 수준에 의해 정의된 시각 및 오디오 동작을 사용합니다. 중요도 수준에 관한 자세한 내용은 아래를 참조하세요.

채널의 기본 알림 동작을 추가로 맞춤설정하려면 NotificationChannel에서 enableLights(), setLightColor(), setVibrationPattern()과 같은 메서드를 호출하세요. 하지만 채널을 만든 후에는 이 설정을 변경할 수 없으며 사용자가 동작의 활성화 여부를 최종적으로 제어합니다.

createNotificationChannels()를 호출하여 한 번의 작업으로 여러 알림 채널을 만들 수도 있습니다.

중요도 수준 설정

채널 중요도는 채널에 게시된 모든 알림의 중단 수준에 영향을 미치며 NotificationChannel 생성자에서 지정해야 합니다. IMPORTANCE_NONE(0)~IMPORTANCE_HIGH(4)의 다섯 가지 중요도 수준 중 하나를 사용할 수 있습니다. 채널에 할당하는 중요도 수준은 채널에 게시하는 모든 알림 메시지에 적용됩니다.

Android 7.1(API 레벨 25) 이하를 실행하는 기기를 지원하려면 NotificationCompat 클래스의 우선순위 상수를 사용하여 알림별로 setPriority()를 호출해야 합니다.

중요도(NotificationManager.IMPORTANCE_*) 및 우선순위 상수(NotificationCompat.PRIORITY_*)는 표 1에 표시된 대로 사용자가 볼 수 있는 중요도 옵션으로 매핑됩니다.

표 1. 채널 중요도 수준

사용자가 볼 수 있는 중요도 수준 중요도(Android 8.0 이상) 우선순위(Android 7.1 이하)
긴급
알림음이 울리며 헤드업 알림으로 표시됩니다.
IMPORTANCE_HIGH PRIORITY_HIGH 또는 PRIORITY_MAX
높음
알림음이 울립니다.
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
중간
알림음이 없습니다.
IMPORTANCE_LOW PRIORITY_LOW
낮음
알림음이 없고 상태 표시줄에 표시되지 않습니다.
IMPORTANCE_MIN PRIORITY_MIN

중요도와 관계없이 모든 알림은 알림 창 및 런처 아이콘의 배지와 같이 사용자를 방해하지 않는 시스템 UI 위치에 표시됩니다. 단, 알림 배지가 표시되는 형식은 수정할 수 있습니다.

채널을 NotificationManager에 제출한 후에는 중요도 수준을 변경할 수 없습니다. 하지만 사용자는 언제든지 앱 채널의 환경설정을 변경할 수 있습니다.

적절한 우선순위 수준을 선택하는 방법에 관한 내용은 알림 디자인 가이드의 '우선순위 수준'을 참조하세요.

알림 채널 설정 읽기

사용자는 진동 및 경고 알림 소리와 같은 동작을 포함하여 알림 채널의 설정을 수정할 수 있습니다. 따라서 사용자가 알림 채널에 적용한 설정을 확인하려면 다음 단계를 따르세요.

  1. getNotificationChannel() 또는 getNotificationChannels()를 호출하여 NotificationChannel 개체를 가져옵니다.
  2. getVibrationPattern(), getSound(), getImportance()와 같은 특정 채널 설정을 쿼리합니다.

그런 다음 앱의 의도된 동작을 금지한다고 생각되는 채널 설정을 감지한 경우 사용자에게 채널 설정을 변경할 것을 제안하고 채널 설정을 열기 위한 작업을 제공할 수 있습니다(다음 섹션 참조).

알림 채널 설정 열기

알림 채널을 만든 후에는 프로그래매틱 방식으로 알림 채널의 시각 및 오디오 동작을 변경할 수 없습니다. 사용자만 시스템 설정에서 채널 동작을 변경할 수 있습니다. 사용자가 알림 설정에 쉽게 액세스할 수 있도록 하려면 앱의 설정 UI에 이 시스템 설정을 여는 항목을 추가해야 합니다.

ACTION_CHANNEL_NOTIFICATION_SETTINGS 작업을 사용하는 Intent로 알림 채널의 시스템 설정을 열 수 있습니다.

예를 들어 다음 샘플 코드는 사용자를 알림 채널의 설정으로 리디렉션하는 방법을 보여줍니다.

Kotlin

    val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
        putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
        putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
    }
    startActivity(intent)
    

자바

    Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
    intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
    intent.putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId());
    startActivity(intent);
    

인텐트에는 앱의 패키지 이름(애플리케이션 ID라고도 함)과 수정할 채널을 지정하는 두 가지 추가 기능이 필요합니다.

알림 채널 삭제

deleteNotificationChannel()을 호출하여 알림 채널을 삭제할 수 있습니다. 다음 샘플 코드는 이 프로세스를 완료하는 방법을 보여줍니다.

Kotlin

    // The id of the channel.
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    val id: String = "my_channel_01"
    notificationManager.deleteNotificationChannel(id)
    

자바

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // The id of the channel.
    String id = "my_channel_01";
    notificationManager.deleteNotificationChannel(id);
    

알림 채널 그룹 만들기

설정 UI에서 채널의 모양을 추가로 구성하려면 채널 그룹을 만드세요. 이 기능은 앱에서 여러 사용자 계정(예: 직장 프로필)을 지원할 때 각 계정의 알림 채널 그룹을 만들 수 있으므로 유용합니다. 사용자는 이 방법으로 이름이 동일한 여러 알림 채널을 쉽게 식별하고 제어할 수 있습니다.

그림 2. 개인 및 직장 계정용 그룹이 있는 알림 채널 설정

예를 들어 소셜 네트워킹 앱에 개인 및 직장 계정 지원 기능이 포함될 수 있습니다. 이 시나리오에서 각 계정에 다음과 같이 기능과 이름이 동일한 여러 알림 채널이 필요할 수도 있습니다.

  • 채널이 두 개 있는 개인 계정:
    • 새로운 댓글
    • 추천 게시물
  • 채널이 두 개 있는 비즈니스 계정:
    • 새로운 댓글
    • 추천 게시물

알림 채널을 계정별 그룹으로 구성하면 사용자가 알림 채널을 쉽게 구별할 수 있습니다.

알림 채널 그룹마다 패키지 내에서 고유한 ID 및 사용자가 볼 수 있는 이름이 필요합니다. 다음 스니펫은 알림 채널 그룹을 만드는 방법을 보여줍니다.

Kotlin

    // The id of the group.
    val groupId = "my_group_01"
    // The user-visible name of the group.
    val groupName = getString(R.string.group_name)
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
    

자바

    // The id of the group.
    String groupId = "my_group_01";
    // The user-visible name of the group.
    CharSequence groupName = getString(R.string.group_name);
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));
    

새 그룹을 만든 후 setGroup()을 호출하여 새 NotificationChannel 개체를 그룹과 연결할 수 있습니다.

채널을 알림 관리자에게 제출한 후에는 알림 채널과 그룹 간의 연결을 변경할 수 없습니다.