-
[Android] Notification 구현 예제 및 ChannelAndroid 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");
그 외에 채널 그룹과 같은 정보나 세세한 설정 사항은 안드로이드 개발자 가이드나 박상권님 블로그에 잘 나와있다.
'Android' 카테고리의 다른 글
[Android] AAC-LiveData의 setValue와 postValue (3) 2021.04.23 [Android] FCM을 이용해 Push 구현하기 (28) 2021.04.15 [Android] 스레드(Thread)와 핸들러(Handler), 작업 스레드에서 UI 업데이트 요청하기 (2) 2021.04.14 [Android] JSON 라이브러리 : GSON (0) 2021.04.12 [Android] 권한(Permission)과 위험 권한 요청 방법 (5) 2021.04.08