ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Notification 구현 예제 및 Channel
    Android 2021. 4. 15. 16:32
    반응형

     

    기본 상단 알림 구현하기

    안드로이드에서는 화면 상단에 정보를 표시해서 사용자에게 메시지나 상태를 보여주는 알림을 구현할 수 있다.

    상단 알림은 NotificationManager 시스템 서비스와 NotificationCompat.Builder를 이용해 간단하게 생성하고 등록할 수 있다.

     

    안드로이드 오레오(API 26) 이상부터는 채널이 필요하다.

    * 채널에 대한 내용은 본문 하단에 정리했으니 거기서 자세히 살펴보자.

    Build.VERSION.SDK_INT를 이용해 버전을 확인하고 오레오 이전 이후로 나눠서 Builder를 만든다.

    NotificationCompat.Builder builder = null;
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        builder = new NotificationCompat.Builder(context, CHANNEL_ID);
    }else {
        builder = new NotificationCompat.Builder(context);
    }

     

     

    그리고 builder에 알림 내용과 아이콘을 설정해주자.

    builder.setContentTitle(title)
    			.setContentText(content)
    			.setSmallIcon(R.drawable.notification_icon);

     

     

    builder의 build()를 통해 Notification 객체를 생성하고,

    알림을 표시하기위해 NotificationManagerCompat.notify()를 호출하여 알림의 고유 ID와 함께 전달한다.

    Notification notification = builder.build();
    
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
    notificationManager.notify(NOTIFICATION_ID, notification);

    * 알림 ID는 알림을 업데이트하거나 삭제하는데 사용된다.

     


    알림 클릭시 동작 추가하기

    위처럼 구현하면 알림을 띄울 수는 있지만 아무 동작을 하지 않는다.

    알림을 클릭했을 때 앱을 실행하거나 어떤 동작을 하기 위해서는 PendingIntent가 필요하다.

     

    PendingIntent

    펜딩인텐트는 인텐트의 일종으로 작업을 요청하는 인텐트를 사전에 생성하고, 어떤 시점에 요청할 수 있다.

    쉽게 말하면 "대기하다가 원하는 시점에 실행"한다고 볼 수 있다.

    Notification, AppWidget, AlarmManager 등에서 주로 사용된다.

     

    특정 화면을 띄우는 동작 구현하기

    펜딩인텐트를 이용해 알림을 클릭했을 때 앱의 특정 화면을 띄우는 기능을 구현해보자.

    먼저 화면을 띄울 액티비티를 지정하는 인텐트를 이용해 펜딩인텐트를 생성한다.

    Intent intent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = new PendingIntent(this, 101, intent, PendingIntent.FLAG_UPDATE_CURRENT);

     

    그리고 builder설정을 할때 setContentIntent()에 생성한 펜딩인텐트를 전달하면,

    알림을 클릭했을 때 해당 인텐트를 이용해 화면을 띄울 수 있다.

    setAutoCancel() 메서드도 추가로 호출했는데, 이 메서드는 알림을 클릭했을 자동으로 알림 표시를 삭제하라는 설정이다.

    builder.setContentTitle(title)
    			.setContentText(content)
    			.setSmallIcon(R.drawable.notification_icon)
    			.setAutoCancel(true)
    			.setContentIntent(pendingIntent);

     

    확장형 알림 만들기

    큰 이미지를 추가하거나, 긴 텍스트를 추가하기 위해서는 builder에 설정을 추가하는 것으로 간단하게 처리할 수 있다.

     

    예를 들어 이미지를 추가하기 위해서는 setStyle()메서드에 NotificationCompat.BigPictureStyle 인스턴스를 전달한다.

    builder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(myBitmap));

     

    알림이 접힌 상태일때 미리보기 이미지에 추가하려면 setLargeIcon에 추가하고, 펼칠때는 setLargeIcon()에 null을 넣어서 제거해준다.

    builder.setLargeIcon(myBitmap)
           .setStyle(new NotificationCompat.BigPictureStyle()
                    .bigPicture(myBitmap)
                    .setLargeIcon(null));

     

    긴글은 setStyle() 메서드에 NotificationCompat.BigTextStyle을 적용하면 된다.

    builder.setStyle(new NotificationCompat.BigTextStyle()
           .bigText("long text...."));

     

     

     

    알림에 대한 다양한 구현 방법이나 업데이트, 삭제에 대한 방법은 아래 안드로이드 가이드를 참고하자.

    [참고] 안드로이드 개발자 가이드 - Notification

     

     


    채널(Channel)이란?

    안드로이드 오레오(API 26) 이상부터는 모든 알림에 채널을 할당해야한다. 채널을 할당하지 않으면 알림이 오지 않는다...

    채널은 알림마다 설정해서 채널을 통해 알림을 분류하고, 채널별로 설정을 다르게 지정할 수 있다.

     

    채널 생성하기

    채널은 고유한 ID, 채널 이름, 채널 중요도를 통해 객체를 생성하고,

    NotificationManager의 createNotificationChannel()를 이용해서 등록할 수 있다.

    알림이 올때마다 만들 필요가 없고 딱 한번만 만들면 된다.

    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "CHANNEL_NAME", NotificationManager.IMPORTANCE_DEFAULT);
        notificationManager.createNotificationChannel(channel);
    }

     

    NotificationChannel 클래스의 setDescription(), setVibrationPattern(), setSound()등을 이용해 필요한 설정을 할 수 있다.

    자세한건 안드로이드 레퍼런스 문서에서 사용가능한 메서드를 확인하자.

     

    채널 지정하기

    알림에 지정할때는 Builder 객체에 채널을 같이 지정해주면 된다.

    Notification.Builder builder = new Notification.Builder(context, channel);

     

     

    채널 수정 및 삭제

    채널은 생성 후에 NotificationManager의 getNotificationChannel()에 고유한 채널 ID를 전달하여 가져올 수 있다.

    채널의 중요도, 진동 등은 변경 불가능하고 오로지 이름과 설명만 수정할 수 있다.

    NotificationChannel channel = notificationManager.getNotificationChannel("CHANNEL_ID"); channel.setName("CHANGE_NAME"); 
    notificationManager.createNotificationChannel(channel);

     

    그래서 새로 설정을 하기 위해서는 deleteNotificationChannel()를 이용해 삭제 후 새로 생성해주면 되는데,

    사용자가 설정한 해당 채널의 설정이 없어지기 때문에 주의하자.

    notificationManager.deleteNotificationChannel("CHANNEL_ID");

     

     

     

    그 외에 채널 그룹과 같은 정보나 세세한 설정 사항은 안드로이드 개발자 가이드나 박상권님 블로그에 잘 나와있다.

    [참고] 안드로이드 개발자 가이드 - Channel

    [참고] 박상권의 삽질블로그 - 8.0 오레오 알림채널(Notification Channel) 대응하기


    댓글