Key classes

  1. Notification
  2. NotificationManager

In this document

  1. The Basics
  2. Managing your Notifications
  3. Creating a Notification
    1. Updating the notification
    2. Adding a sound
    3. Adding vibration
    4. Adding flashing lights
    5. More features
  4. Creating a Custom Expanded View

상태바Status Bar 노티피케이션은 시스템의 상태바(선택 사항으로 조회 텍스트(ticker-text) 메시지를 가짐)에 아이콘을, 그리고 “노티피케이션notifications” 윈도우에는 확장 메시지를 추가한다. 그 사용자가 확장 메시지를 선택할 때, 안드로이드는 노티피케이션에 정의된 인텐트를 발생시킨다(보통 액티비티를 런치하기 위해). 여러분은 또한 디바이스 상의 사운드sound, 진동vibration, 그리고 발광 빛flashing light을 사용해서 사용자에게 경보alert하도록 노티피케이션을 설정할 수 있다.

상태바 노티피케이션은 백그라운드 서비스Service가 사용자에게 응답을 요구하는 이벤트를 경보alert 하는 것이 필요한 경우에 사용되어야 한다. 백그라운드 서비스는 사용자와의 상호작용을 받아들이기 위해 그것 자신의 액티비티를 결코 런치해서는 안된다. 서비스는 대신 사용자에 의해 선택될 때, 액티비티를 런치할 상태바 노티피케이션을 생성해야 한다.

아래의 스크린샷은 왼쪽 사이드에 노티피케이션 아이콘을 가진 상태바를 보여준다.

아래의 스크린샷은 “노티피케이션Notifications” 윈도우에 있는 노티피케이션의 확장 메시지를 보여준다. 사용자는 상태바를 아래로 내림(또는 홈 옵션 메뉴에서 노티피케이션을 선택함)으로써 노티피케이션 윈도우를 나타나게 할 수 있다.

기초(The Basics)

액티비티 또는 서비스는 상태바 노티피케이션을 시작시킬 수 있다. 액티비티는 그것이 활성화되어 있고 포커스되어 있는 동안에만 액션을 수행할 수 있기 때문에, 여러분은 서비스로부터 여러분의 상태바 노티피케이션을 생성해야 한다. 이 방식에서, 노티피케이션은 사용자가 다른 애플리케이션을 사용하거나 또는 그 디바이스가 절전상태에 있는 동안 백그라운드로부터 생성될 수 있다. 노티피케이션을 생성하기 위해서, 여러분은 두 가지 클래스를 사용해야 한다: Notification과 NotifactionManager가 그것이다.

상태바status bar 아이콘, 확장 메시지expanded message, 그리고 재생할 사운드와 같은 별도의 설정과 같이, 여러분의 상태 바 노티피케이션의 속성들을 정의하기 위해서는 노티피케이션Notification 클래스의 인스턴스를 사용하라. 노티피케이션 매니저NotificationManager는 모든 노티피케이션을 실행하고 관리하는 안드로이드 시스템 서비스이다. 여러분은 노티피케이션 매니저를 인스턴스화하지는 않는다. 여러분의 노티피케이션을 노티피케이션 매니저에게 건네주기 위해, 여러분은 getSystemService()를 사용하여 노티피케이션 매니저에 대한 레퍼런스를 얻어와야 한다. 그런 다음에 여러분이 사용자에게 통보하길 원할 때, notify()를 사용해서 노티피케이션 매니저에게 여러분의 노티피케이션 오브젝트를 전달하라.

상태바 노티피케이션을 생성하기 위해서는 다음과 같이 하라.

  1. 노티피케이션 매니저에 대한 레퍼런스를 얻어라.
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
    
  2. 노티피케이션을 인스턴스화하라.
    int icon = R.drawable.notification_icon;
    CharSequence tickerText = "Hello";
    long when = System.currentTimeMillis();
    
    Notification notification = new Notification(icon, tickerText, when);
    
  3. 노티피케이션의 확장 메시지와 인텐트를 정의하라.
    Context context = getApplicationContext();
    CharSequence contentTitle = "My notification";
    CharSequence contentText = "Hello World!";
    Intent notificationIntent = new Intent(this, MyClass.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    
    notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
    
  4. 노티피케이션 매니저에게 노티피케이션을 전달하라.
    private static final int HELLO_ID = 1;
    
    mNotificationManager.notify(HELLO_ID, notification);
    

    이것이 끝이다. 여러분의 사용자는 이제 노티피케이션을 통보받았다notified.

노티피케이션 관리하기(Managing your Notifications)

노티피케이션 매니저NotificationManager는 모든 노티피케이션을 관리하는 시스템 서비스이다. 여러분은 getSystemService()를 사용해서 노티피케이션 매니저에 대한 레퍼런스를 얻어와야 한다. 예를 들어 다음과 같다.

String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

여러분이 상태바 노티피케이션을 전송하고자 할 때, 노티피케이션 매니저에게notify(int,Notification)를 사용해서 노티피케이션 오브젝트를 파라미터로 전달하라. 첫 번째 파라미터는 노티피케이션에 대한 고유한 ID이며, 두 번째는 노티피케이션 오브젝트이다. 그 ID는 여러분의 애플리케이션으로부터 그 노티피케이션을 고유하게 식별한다. 이 ID는 여러분이 노티피케이션을 업데이트하는 것이 필요하거나 또는 (여러분의 애플리케이션이 다른 종류의 노티피케이션들을 관리한다면) 사용자가 노티피케이션에 정의된 인텐트를 통해 여러분의 애플리케이션으로 돌아올 때 적절한 액션을 선택하는 것이 필요할 때 필수적이다.

사용자가 노티피케이션 윈도우에서 상태바 노티피케이션을 선택할 때 그것을 없애기 위해서는, 여러분의 노티피케이션 오브젝트에 “FLAG_AUTO_CANCEL” 플래그를 추가하라. 여러분은 또한 cancel(int)를 사용해서 상태바 노티피케이션에 노티피케이션 ID를 전달함으로써 수동으로 그것을 없앨 수 있으며, 또한 cancelAll()를 사용해서 여러분의 모든 노티피케이션을 없앨 수 있다.

노티피케이션 생성(Creating a Notification)

노티피케이션Notificaton 오브젝트는 상태바에 표시되는 노티피케이션 메시지의 상세 사항과 “노티피케이션Notifcations” 윈도우, 그리고 사운드와 깜박이는 발광 빛과 같은 그 밖의 경보 설정을 정의한다.

상태바 노티피케이션은 다음과 같은 모든 것을 요구한다.

  • 상태 바에 대한 아이콘.
  • 확장 뷰에 대한 타이틀과 확장 메시지(만약 여러분이 커스텀 확장 뷰를 정의하지 않는다면).
  • 노티피케이션이 선택될 때 일어나도록 하기 위한 PendingIntent.

상태바 노티피케이션에 대한 선택적인 설정에는 다음과 같은 것이 포함된다.

  • 상태바에 대한 조회 텍스트(ticker-text) 메시지
  • 경보 사운드
  • 진동 설정
  • 발광 LED 설정

신규 노티피케이션에 대한 시작 도구는 Notification(int,CharSequence,long) 생성자와 setLatestEventInfo(Context,CharSequence,CharSequence, PendingIntent) 메쏘드를 포함한다. 이것들은 노티피케이션에 대해 요구되는 모든 설정을 정의한다. 아래의 단편snippet은 기본적인 노티피케이션 셋업을 보여준다.

int icon = R.drawable.notification_icon;        // icon from resources
CharSequence tickerText = "Hello";              // ticker-text
long when = System.currentTimeMillis();         // notification time
Context context = getApplicationContext();      // application Context
CharSequence contentTitle = "My notification";  // expanded message title
CharSequence contentText = "Hello World!";      // expanded message text

Intent notificationIntent = new Intent(this, MyClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

// the next two lines initialize the Notification, using the configurations above
Notification notification = new Notification(icon, tickerText, when);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

노티피케이션 업데이트하기(Updating the notification)

이벤트들이 여러분의 애플리케이션에서 계속 발생함에 따라 여러분은 상태바 노티피케이션에 있는 정보를 업데이트할 수 있다. 예를 들어 이전 메시지가 읽혀지기 전에 신규 SMS 텍스트 메시지가 도착하면, 그 메시징 애플리케이션은 수신된 신규 메시지의 전체 숫자를 보여주기 위해 이미 존재하는 노티피케이션을 업데이트 한다. 이미 존재하는 노티피케이션을 업데이트하는 이 방식은, 노티피케이션 윈도우에서의 혼란clutter을 피하기 때문에 노티피케이션 매니저에 신규 노티피케이션을 추가하는 것보다 훨씬 더 좋다.

각각의 노티피케이션은 정수integer ID를 가지고 노티피케이션 매니저에 의해 고유하게 식별되기 때문에, 여러분은 신규 값을 가지고 setLatestEventInfo()를 호출함으로써 노티피케이션을 수정하고, 그 노티피케이션의 일부 필드 값들을 변경하고, 그리고 나서 다시 notify()를 호출할 수 있다.

여러분은 (컨텍스트와 확장 메시지 타이틀과 텍스트를 제외하고) 오브젝트 멤버 필드를 사용해서 각각의 속성을 수정할 수 있다. contentTitle과 contentText에 대한 신규 값을 가지고 setLatestEventInfo()를 호출함으로써 여러분이 그 노티피케이션을 업데이트할 때, 여러분은 항상 그 텍스트 메시지를 변경revise해야 한다. 그런 다음 그 노티피케이션을 업데이트 하기 위해 notify()를 호출하라(물론, 만약 여러분이 커스텀 확장 뷰를 생성했다면, 이러한 타이틀과 텍스트 값을 업데이트하는 것은 아무런 영향을 주지 않는다).

사운드 추가하기(Adding a sound)

여러분은 디폴트 노티피케이션 사운드(이것은 사용자에 의해 정의된다) 또는 여러분의 애플리케이션에 의해 지정된 사운드를 사용해서 사용자에게 경보alert할 수 있다.

사용자의 디폴트 사운드를 사용하기 위해서는, 디폴트 필드에 “DEFAULT_SOUND”를 추가하라.

notification.defaults |= Notification.DEFAULT_SOUND;

여러분의 노티피케이션에서 다른 사운드를 사용하기 위해서는, 사운드 필드에 Uri 레퍼런스를 전달하라. 다음의 예제는 디바이스 SD 카드에 저장된 알고 있는 오디오 파일을 사용한다.

notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");

다음의 예제에서는, 그 오디오 파일이 내부 MediaStore 컨텐트 프로바이더에서 선택된다.

notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");

이 경우에, 미디어 파일 (“6”)에 대한 정확한 ID를 알고 있으며, 그리고 컨텐트 Uri의 끝에 덧붙여진다. 만약 여러분이 정확한 ID를 모른다면, 여러분은 컨텐트 리졸버ContentResolver를 사용해서 미디어스토어MediaStore에서 사용가능한 모든 미디어를 쿼리해야 한다. 컨텐트 리졸버ContentResolver를 사용하는 것에 대한 더 자세한 정보에 대해서는 7장. “컨텐트 프로바이더”를 보라.

만약 여러분이 사용자가 노티피케이션에 응답할 때까지 또는 노티피케이션이 취소될 때까지 사운드가 계속해서 반복되길 원한다면, 그 플래그 필드에 “FLAG_INSISTENT”를 추가하라.

Note: 만약 그 디폴트 필드가 “DEFAULT_SOUND” 를 포함한다면, 그러면 그 디폴트 사운드는 사운드 필드에 의해 정의된 임의의 사운드를 오버라이드 한다.

진동 추가하기(Adding vibration)

여러분은 디폴트 진동 패턴 또는 여러분의 애플리케이션에 의해 정의된 진동 패턴을 사용해서 사용자에게 경보alert할 수 있다.

디폴트 패턴을 사용하기 위해서는, 디폴트 필드에 “DEFAULT_VIBRATE”를 추가하라.

notification.defaults |= Notification.DEFAULT_VIBRATE;

여러분 자신의 진동 패턴을 정의하기 위해서는 vibrate 필드에 long 값 배열을 전달하라.

long[] vibrate = {0,100,200,300};
notification.vibrate = vibrate;

long 배열은 진동이 꺼지고 켜지는 길이에 대한 번갈아 있는 패턴을 (1/1000초 단위로) 정의한다. 첫 번째 값은 시작하기 전에 얼마나 오래 기다릴 것인가(꺼진 상태)이고, 두 번째 값은 첫 번째 진동의 길이이고, 세 번째는 그 다음의 꺼져 있는 길이, 그리고 기타 등등이다. 그 패턴은 여러분이 좋아하는 만큼 길 수 있으나 반복되도록 설정될 수 없다.

Note: 만약 디폴트 필드가 “DEFAULT_VIBRATE”를 포함한다면, 그러면 그 디폴트 진동은 vibrate 필드에 의해 정의된 임의의 진동을 오버라이드 한다.

발광 빛 추가하기(Adding flashing lights)

발광 LED 빛을 사용해서 사용자에게 경보alert하기 위해서, 여러분은 (만약 사용할 수 있다면) 디폴트 빛 패턴을 구현할 수 있거나 또는 여러분 자신의 컬러와 그 빛에 대한 패턴을 정의할 수 있다.

디폴트 빛을 설정하기 위해서는 그 디폴트 필드에 “DEFAULT_LIGHTS”를 추가하라.

notification.defaults |= Notification.DEFAULT_LIGHTS;

여러분 자신의 컬러와 패턴을 정의하기 위해서는 (컬러에 대해서는) ledARGB 필드, ledOffMS 필드(1/1000초 단위의 빛이 꺼져 유지되는 시간의 길이), ledOnMS(1/1000초 단위의 빛이 켜져 유지되는 시간의 길이) 값을 정의하고, 그리고 또한 그 플래그 필드에 “FLAG_SHOW_LIGHTS”를 추가하라.

notification.ledARGB = 0xff00ff00;
notification.ledOnMS = 300;
notification.ledOffMS = 1000;
notification.flags |= Notification.FLAG_SHOW_LIGHTS;

이 예제에서, 초록색 빛이 반복적으로 300 밀리세컨드(1/1000초) 동안 켜지고 1초 동안 꺼진다. 스펙트럼 내의 모든 컬러가 디바이스 LED에 의해 지원되는 것은 아니다. 그리고 모든 디바이스가 동일 컬러를 지원하지 않는다. 그러므로 그 하드웨어는 자신의 능력의 최선을 산정한다. 초록색은 가장 일반적인 노티피케이션 컬러이다.

더 많은 기능(More features)

여러분은 노티피케이션 필드와 플래그를 사용해서 여러분의 노티피케이션에 더 많은 몇가지 기능들을 추가할 수 있다. 약간의 유용한 기능들이 아래에 포함되어 있다.

"FLAG_AUTO_CANCEL" flag
노티피케이션 윈도우에서 노티피케이션이 선택된 이후, 그 노티피케이션이 자동으로 취소되게끔 하기 위해서는 이 플래그를 flags 필드에 추가하라.
"FLAG_INSISTENT" flag
사용자가 응답할 때까지 오디오를 반복시키기 위해서는 이 플래그를 flags 필드에 추가하라.
"FLAG_ONGOING_EVENT" flag
노티피케이션 윈도우의 “Ongoing” 타이틀 아래의 노티피케이션을 그룹화하기 위해서는 이것을 그 플래그에 추가하라. 이것은 애플리케이션이 진행중on-going이라는 것을 가리킨다 ? (뮤직이나 전화 호출과 같이) 심지어 애플리케이션이 보이지 않을 때 조차도, 그 애플리케이션 프로세스는 여전히 백그라운드에서 실행중이다.
"FLAG_NO_CLEAR" flag
노티피케이션이 “Clear” 노티피케이션 버튼에 의해서 없어져서는 안된다는 것을 가리키기 위해서는 이 플래그를 flags 필드에 추가하라. 만약 여러분의 노티피케이션이 진행중이라면 이것은 특별히 유용하다.
number field
이 값은 노티피케이션에 의해 보여지는 현재의 이벤트 갯수를 가리킨다. 그에 알맞는 숫자가 상태바 아이콘 상단에 오버레이된다. 만약 여러분이 이 필드를 사용하고자 한다면, 여러분은 노티피케이션이 처음 생성될 때 “1”을 가지고 시작해야 한다(만약 여러분이 그 값을 업데이트 동안에 0에서 더 큰 어떤 수로 바꾼다면, 그 숫자는 보여지지 않는다).
iconLevel field
이 값은 노티피케이션 아이콘을 위해 사용되는 LevelListDrawable의 현재 레벨을 가리킨다. 여러분은 LevelListDrawable에 정의된 드로어블에 대응하는 이 값을 변경함으로써 상태바에서 아이콘을 애니메이션 할 수 있다. 더 많은 정보에 대해서는 LevelListDrawable 레퍼런스를 보라.

여러분의 애플리케이션을 커스터마이징할 수 있는 추가적인 기능들에 대한 더 자세한 정보에 대해서는 노티피케이션Notification 클래스 레퍼런스를 보라.

커스텀 확장 뷰 생성하기(Creating a Custom Expanded View)

디폴트로, “노티피케이션Notifications” 윈도우에서 사용되는 확장 뷰는 기본적인 타이틀과 텍스트 메시지를 포함한다. 이것들은 setLatestEventInfo() 메쏘드의 content Title과 contentText 파라미터에 의해 정의된다. 하지만 여러분은 또한 리모트뷰RemoteViews를 사용해서 확장 뷰에 대한 커스텀 레이아웃을 정의할 수 있다. 위에 보이는 스크린샷은 LinearLayout에 이미지 뷰와 텍스트 뷰를 사용한 커스텀 확장 뷰의 예제이다.

확장 메시지에 대한 여러분 자신의 레이아웃을 정의하기 위해서는, 리모트뷰RemoteViews 오브젝트를 인스턴스화하고, 여러분의 노티피케이션의 컨텐트뷰contentView 필드에 리모트뷰RemoteView를 전달하라. contentIntent 필드에는 PendingIntent를 전달하라.

커스텀 확장 뷰를 생성하는 것은 예제를 통해 가장 잘 이해된다.

  1. 확장 뷰에 대한 XML 레이아웃을 생성하라. 예를 들어 custom_notificat ion_layout.xml 이라 불리는 레이아웃 파일을 생성하고, 그것을 다음과 같이 만들어라.
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="horizontal"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:padding="3dp"
                  >
        <ImageView android:id="@+id/image"
                  android:layout_width="wrap_content"
                  android:layout_height="fill_parent"
                  android:layout_marginRight="10dp"
                  />
        <TextView android:id="@+id/text"
                  android:layout_width="wrap_content"
                  android:layout_height="fill_parent"
                  android:textColor="#000"
                  />
    </LinearLayout>
    

    이 레이아웃은 확장 뷰를 위해 사용된다. 그러나 이미지 뷰와 텍스트 뷰의 컨텐트는 여전히 애플리케이션에 의해 정의될 필요가 있다. 리모트뷰RemoteViews는 이 컨텐트를 여러분으로 하여금 정의할 수 있도록 하는 약간의 편리한 메쏘드들을 제공한다.

  2. 애플리케이션 코드에서, 이미지와 텍스트를 정의하기 위해서는 리모트뷰RemoteViews 메쏘드를 사용하라. 그런 다음에 아래의 예제에서 보여지듯이 리모트뷰RemoteViews 오브젝트를 노티피케이션의 컨텐트뷰contentView 필드에 전달하라.
    RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);
    contentView.setImageViewResource(R.id.image, R.drawable.notification_image);
    contentView.setTextViewText(R.id.text, "Hello, this message is in a custom expanded view");
    notification.contentView = contentView;
    

    여기에서 보여지듯이, 애플리케이션의 패키지 이름과 레이아웃 리소스 ID를 리모트뷰RemoteViews 생성자constructor에게 전달하라. 그런 다음에, setImageViewResource()와 setTextViewText()를 사용해서 이미지 뷰와 텍스트 뷰에 대한 내용을 정의하라. 각각의 경우에서, 해당 뷰에 대한 값과 함께 여러분이 설정하고자 하는 적절한 뷰 오브젝트의 레퍼런스 ID를 전달하라. 최종적으로 그 리모트뷰RemoteViews 오브젝트는 컨텐트뷰contentView 필드로 노티피케이션에게 전달된다.

  3. 여러분이 커스텀 뷰를 사용할 때 setLatestEventInfo() 메쏘드를 필요로 하지 않기 때문에, 여러분은 이 예제에서처럼 contentIntent 필드를 사용해서 노티피케이션에 대한 인텐트를 정의해야 한다.
    Intent notificationIntent = new Intent(this, MyClass.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    notification.contentIntent = contentIntent;
    
  4.  노티피케이션은 이제 보통의 경우처럼 전송될 수 있다.
    mNotificationManager.notify(CUSTOM_VIEW_ID, notification);

리모트뷰RemoteViews 클래스는 또한 여러분의 노티피케이션의 확장 뷰에 측정기Chronometer 또는 진행상태바ProgressBar를 쉽게 추가하기 위해 사용할 수 있는 메쏘드들을 포함한다. 리모트뷰RemoteViews 를 사용해서 커스텀 레이아웃을 생성하는 것에 대한 더 자세한 정보에 대해서는 리모트뷰RemoteViews 클래스 레퍼런스를 참고하라.

Note: 커스텀 확장 뷰를 생성할 때 여러분은 특별히 여러분의 커스텀 레이아웃이 다른 디바이스 오리엔테이션과 해상도에서 적절하게 기능하는 지를 보장하기 위해 주의해야 한다. 이 조언은 안드로이드 상에 생성된 모든 뷰 레이아웃에 적용되지만, 그것은 특별히 이 경우에 중요하다. 왜냐하면 여러분의 레이아웃 실소유물real estate이 매우 제한되기 때문이다. 그러므로 여러분의 커스텀 레이아웃을 너무 복잡하게 만들지 마라. 그리고 다양한 설정에서 그것을 확실히 테스트하라.

'안드로이드' 카테고리의 다른 글

java.lang.Annotation(주석:@)  (0) 2011.01.27
View Fipper  (0) 2011.01.27
PowerManager  (0) 2011.01.27
Accelerometer, orientation  (0) 2011.01.27
Notification Manager  (0) 2011.01.27

+ Recent posts