공부용 블로그

(1)Notification_Notification Channel, Notification Manager, NotificationCompat.Builder 본문

Android

(1)Notification_Notification Channel, Notification Manager, NotificationCompat.Builder

tomato212 2020. 8. 3. 05:06

notification 은 앱이 foregound 상태에 있지 않더라도 사용자에게 정보를 보여줄 수 있는 메세지이다.

예를 들어, 

1) 쇼핑앱에서 사용자에게 상품의 세일 소식을 알려주거나

2) 스포츠앱에서 사용자가 좋아하는 스포츠팀이 지금 막 득점을 했다거나 

 

안드로이드 8.0 혹은 그 이상인 경우 알림이 왔을때 앱아이콘 위에 뱃지가 표시된다.

Reddit 앱 우측상단 badge = notification dots

 

사용자가 앱 아이콘을 롱클릭했을때는 앱 아이콘 위로 알림이 보여진다.

 

 

실제로 어떻게 동작하는지 적용해보자.

다음 예제는 Notify ME! 버튼을 눌러 알림이 오게 하고, 알림을 업데이트하거나 취소시키는 앱이다.

이번 글에서는 알림을 오게 하는 것부터 공부해 볼 것이다.

완성된 모습은 아래와 같다.

1. 프로젝트 생성

(1) 프로젝트명 : NotifyMe

(2) activity_main.xml 에 textView 삭제 후 버튼을 아래와 같이 작성

(3) MainActivity.java 코드 작성

 

버튼 멤버 변수 선언

sendNotification() 메서드 생성

onCreate() 에 아래와 같이 작성

 

2. Notification Channel 만들기

안드로이드 8.0(API level 26)부터 사용자가 앱의 알림을 커스텀할 수 있는 notification channel을 코드를 통해 할당할 수 있다.

 

하나의 앱은 여러개의 notification channel(알림 유형으로 분류되어 있음)을 가질 수 있다.

 

설정(Settings app) > 애플리케이션 알림(App notifications) 으로 들어가면 앱을 하나 선택한다. 여기서는 Pinterest.

아래와 같은 화면이 나올것이다.

Pinterest 앱에 여러개의 노티피케이션 채널들(추천 아래로)이 보인다.

회원님을 위한 보드 => 노티채널1 

추천 핀 => 노티채널2

인기 핀 => 노티채널3

 

 

노티 채널 중 인기 핀을 클릭하면 아래와 같은 화면이 보이게 된다.

알림 유형 중 인기 핀 이라는 notfication channel에 동작(ex.소리재생, 진동, LED 상태표시등 등)을 설정하는 것이고,

인기핀 알림 채널에 속한 알림들은 모두 같은 적용을 받게 된다.

 

안드로이드 8.0(API level 26) 이상부터 알림을 보여주려면 적어도 한개 이상의 노티피케이션 채널을 구현해야 한다.

만약 내 앱의 타겟버전이 Android 7.1(API level 25) 이하인데 26 이상에서 실행된다면 25 이하에서 실행되는것과 동일하게 동작한다.

 

노티피케이션 채널이 무엇인지 알았으면 이제 코드로 notification channel을 만들어보자.

 

(1) MainActivity.java 에서 notification channel ID 생성

모든 채널 아이디는 패키지 내에서 고유해야 한다. 나중에 이 아이디를 사용해서 알림을 등록할 것이다.

(2) MainActivity.java 에서 NotificationManager 의 멤버변수 선언

안드로이드 시스템은 NotificationManager 클래스를 통해 사용자에게 알림을 전달한다.

(3) MainActivity.java 에 createNotificationChannel() 메서드를 만들고 NotificationManager를 인스턴스화

(4) createNotificationonChannel() 메서드에서 노티피케이션 채널 생성

(5) 노티피케이션 채널을 생성할 때 필요한 파라미터는 1)채널ID 2)채널이름 3)알림중요도 이다.

채널 이름(여기서는 "Mascot Notification")은 설정(Settings) - 애플리케이션 알림(App notifications) - 알림유형(Categories) 에서 보이는 이름이다.

(4)

 

** 다음은 알림 중요도에 관한 내용이다.

안드로이드 8.0 이상부터는 노티피케이션 채널을 생성할때 파라미터의 필수값으로 importance level을 넣어줘야 한다.

반면 안드로이드 7.1 이하에서는 노티 채널을 생성하지 않으므로 노티피케이션을 빌드할때 즉, NotificationCompat.Builder 클래스에서

setPriority() 를 사용해서 우선순위를 정해줘야 한다.

알림 우선순위(android 7.1 이하) 및 중요도(android 8.0 이상) 

 

(5)

(6) 위 코드에 이어서 if문 안에 노티피케이션 채널의 초기값을 세팅해준다.

 

 

3. Notification 빌드하기

notifications은  NotificationCompat.Builder 클래스를 사용해 만들어진다. 이 클래스를 사용하여 알림의 컨텐츠와 동작을 설정할 수 있다. 알림은 다음의 엘리먼트들을 갖고 있다. 

 

- Icon(required) => setSmallIcon()

- Title(optional) => setContentTitle()

- Detail text(optional) => setContentText()

 

(1) 노티피케이션을 빌드하기 전 notification icon을 만들기

바로 위에서 확인했듯이 아이콘은 필수적인 엘리먼트이므로 사용할 icon의 drawble 파일을 만들어둔다.

 

1) File > New > Image Asset

2) Icon Type 드롭다운 리스트에서 Notification Icons 선택

3) Clip Art 옆에 아이콘을 클릭. 원하는 Material Design 아이콘을 선택

4) 아이콘 리소스 이름은 ic_android 로 변경. Next, finish 차례대로 클릭

 

각각의 다른 해상도와 API 레벨의 drawable 파일들이 만들어졌을것이다.

 

(2) Notification 빌드 (= create a notification)

1) MainActivity.java 에 Notifiacation 아이디 선언

2) onCreate() 마지막에서 createNotificationChannel() 메서드 호출

 

3) NotificationCompat.Builder 객체를 만들때 사용할 getNotificationBuilder() 메서드 생성

지금 이 단계에선 return 값이 없어서 에러가 발생하지만 곧 작성할 것이므로 그대로 진행

4) 위 메서드 안에서 작성.

NotificationCompat.Builder 클래스를 통해서 notification의 속성(title, text, icon 등)을 줄 수 있음

마지막에 notifyBuilder 리턴해줌

** NotificationCompat.Builder 생성자는 파라미터 중 하나로 Notification Channel ID를 가지는데, 이는 Android 8.0 이상에서만 사용되고 더 낮은 버전에서는 무시된다.

(3) notification 보내기 (= issue a notification)

sendNotification() 메서드 안에 작성

코드 의미 : 위에서 만들어놓은 노티피케이션 빌더 객체를 가져온다. 여기엔 알림의 타이틀, 텍스트, 아이콘 정보가 들어있다.

이제 이 노티빌더와 노티아이디를 파라미터로 넣고 노티매니저를 통해 사용자에게 알림을 보낸다.

여기서 노티빌더.build()를 하는 이유는 그전까지는 노티빌더가 객체로 만들어지면서 정보만 가지고 있었고, build()를 함으로써

빌드가 드디어 되는 것. 

(4) 앱 실행 

앱을 실행해보면 버튼을 클릭했을때 상태바 안에 알림이 나타난다. 그렇지만 알림을 탭해도 아무일도 일어나지 않을 것이다.

다음 시간에는 알림을 탭했을때 액티비티로 이동하도록 구현해보자.