본문 바로가기

유저 인터페이스/알림(Notification)

나를 주목하라! - Notification

어플리케이션에서 특정 이벤트가 일어났을 때 (예를 들면 문자메시지가 도착했다거나, SD카드를 넣었을 때 정도가 되겠죠) 사용자에게 그 사실을 인지시켜주어야 합니다.안드로이드에서 사용자에게 이벤트를 알리는 방법은 크게 두가지로, 한 가지는 토스트(Toast)를 이용하는 방법, 다른 한 가지는 이번 글에서 설명하게 될 Notification을 이용하는 방법입니다.

토스트는 잠깐동안 짧은 메시지만을 띄우는 데 주로 사용되며, 메시지가 잠깐동안 화면에 표시되었다가 사라지기 때문에 "정말 중요한 사실"을 전달하기에는 부적합합니다. 


반면 Notification은 화면 위쪽의 상태 바에 표시되며, 해당 Notification을 Notification List에서 지우기 전까지는 계속 리스트에 남아 있으며, 리스트에서 항목을 클릭하면 원하는 컴포넌트를 호출할 수도 있습니다.

메시지가 도착한 모습. 위의 상태 표시줄에 메시지가 표시됩니다.

상태 표시줄을 펼치면 세부 내용이 표시됩니다.



Notification List에 표시된 항목을 클릭하면 관련된 컴포넌트를 호출합니다.



Notification 사용하기

Notification을 만드려면 크게 3가지를 구성해야 합니다.

  1. Ticker Text(상태 표시줄에 표시되는 메시지) 및 이미지
  2. Notification List에 표시되는 항목
  3. Notification List에 표시된 항목을 눌렀을 때 수행할 작업

위의 세 구성요소가 모두 갖춰져야만 제데로 사용자에게 메시지를 전달할 수 있게 됩니다.


Notification 객체 생성하기

Notification을 만들어주기 위해 Notification 객체를 만들어주는 것부터 시작하도록 하겠습니다. Notification 객체를 생성하면서 상태 표시줄에 표시되는 문자 및 아이콘을 지정해주게 됩니다.

Notification notification = new Notification(int icon, CharSequence tickerText, long when);
  • icon : 상태 표시줄에 표시할 아이콘
  • tickerText : 상태 표시줄에 표시할 텍스트
  • when : Notification을 표시할 "시각"


상태 표시줄에 Notification 표시하기

생성한 Notification을 표시하기 위해 setLatestEventInfo()메소드를 사용합니다.


notification.setLatestEventInfo(Context context, CharSequence contentTitle,
                                  CharSequence contentText, PendingIntent contentIntent);

  • context : 어플리케이션/컴포넌트의 컨텍스트 객체
  • contentTitle : Notification List에 표시될 제목
  • contentText : Notification List에 표시될 내용
  • contentIntent : 항목을 눌렀을 때 수행할 작업

이름이나 내용 등은 다른 것들과 비슷비슷하고, 다른 컴포넌트를 호출할 때 인텐트(Intent) 대신 PendingIntent를 사용합니다. 인텐트가 어떤 작업을 할 지 그 "내용"만 담고 있는 것에 반해, PendingIntent는 객체 초기화 과정에서 호출할 컴포넌트를 지정하게 됩니다. 아래의 코드는 액티비티를 호출하는 PendingIntent를 초기화하는 코드입니다.

PendingIntent intent = PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags);
  • context : 어플리케이션/컴포넌트의 컨텍스트 객체
  • requestCode : 요청 코드
  • intent : 처리할 작업을 포함하는 인텐트 객체
  • flags : 기타 액티비티 실행 옵션들

위의 과정을 거쳐 Notification을 상태 표시줄에 표시할 준비가 끝났다면, 생성된 Notification 객체를 NotificationManager에게 넘겨 Notification을 표시해 주도록 합니다.

]
NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); // NotificationManager를 불러옵니다.
nm.notify(NOTIFICATION_ID, notification); // NOTIFICATION_ID의 고유 ID를 가지는 notification을 표시합니다.

생성한 Notification을 표시해주기 위해서는 Notification을 관리해주는 NotificationManager가 필요합니다. 따라서, 위와 같이 NotificationManager를 불러온 후, 생성한 Notification 객체를 고유 ID와 함께 NotificationManager에게 넘겨줍니다.

Notification 객체를 NotificationManager에게 넘겨주면 NotificationManager는 Notification객체의 내용대로 Notification을 표시해주게 됩니다. NotificationManager에 Notification을 등록할 때 Notification 객체와 함께 넘겨주는 고유 ID는 추후 이 Notification을 해제하는데 사용합니다. 메시지가 도착했을 때처럼, 메시지를 확인한 경우 더이상 사용자에게 알려줄 필요가 없으니 Notification을 없애줘야 하겠죠? 고유 ID는 이럴 때 해당 Notification을 찾기 위해 필요합니다.

여기까지 Notification에 대해 간단하게 짚어보았습니다. 다음 글에서는 NotificationBuilder, Notification을 만들어주는 어플리케이션을 만들어보면서 Notification에 대해 좀 더 자세히 알아보도록 하겠습니다.