본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] Notification 고급 정보

by 돼지왕 왕돼지 2012. 5. 26.
반응형


http://developer.android.com/guide/topics/ui/notifiers/notifications.html 

- Background 서비스는 startActivity 를 호출하면 안된다. normal 한 UI 를 방해하여 나쁜 UX 를 초래한다. 대신 Notification 을 이용하여 User 가 Activity 를 띄우는 타이밍을 조절 할 수 있도록 만들어야 한다.


- Intent[] makeMessageIntentStack() 을 통해 Notification click 시 거쳐가는 intent 의 list 를 만들 수 있다. Intent.makeRestartActivityTask() 를 호출해주면 Intent.FLAG_ACTIVITY_CLEAR_TASK 등과 조합되어 root activity 를 만든다.


/**

 * This method creates an array of Intent objects representing the

 * activity stack for the incoming message details state that the

 * application should be in when launching it from a notification.

 */

static Intent[] makeMessageIntentStack(Context context, CharSequence from,

        CharSequence msg) {

    // A typical convention for notifications is to launch the user deeply

    // into an application representing the data in the notification; to

    // accomplish this, we can build an array of intents to insert the back

    // stack stack history above the item being displayed.

    Intent[] intents = new Intent[4];


    // First: root activity of ApiDemos.

    // This is a convenient way to make the proper Intent to launch and

    // reset an application's task.

    intents[0] = Intent.makeRestartActivityTask(new ComponentName(context,

            com.example.android.apis.ApiDemos.class));


    // "App"

    intents[1] = new Intent(context, com.example.android.apis.ApiDemos.class);

    intents[1].putExtra("com.example.android.apis.Path", "App");

    // "App/Notification"

    intents[2] = new Intent(context, com.example.android.apis.ApiDemos.class);

    intents[2].putExtra("com.example.android.apis.Path", "App/Notification");


    // Now the activity to display to the user.  Also fill in the data it

    // should display.

    intents[3] = new Intent(context, IncomingMessageView.class);

    intents[3].putExtra(IncomingMessageView.KEY_FROM, from);

    intents[3].putExtra(IncomingMessageView.KEY_MESSAGE, msg);


    return intents;

}


/**

 * The notification is the icon and associated expanded entry in the

 * status bar.

 */

void showAppNotification() {

    // look up the notification manager service

    NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);


    // The details of our fake message

    CharSequence from = "Joe";

    CharSequence message;

    switch ((new Random().nextInt()) % 3) {

        case 0: message = "r u hungry?  i am starved"; break;

        case 1: message = "im nearby u"; break;

        default: message = "kthx. meet u for dinner. cul8r"; break;

    }


    // The PendingIntent to launch our activity if the user selects this

    // notification.  Note the use of FLAG_CANCEL_CURRENT so that, if there

    // is already an active matching pending intent, cancel it and replace

    // it with the new array of Intents.

    PendingIntent contentIntent = PendingIntent.getActivities(this, 0,

            makeMessageIntentStack(this, from, message), PendingIntent.FLAG_CANCEL_CURRENT);


    // The ticker text, this uses a formatted string so our message could be localized

    String tickerText = getString(R.string.imcoming_message_ticker_text, message);


    // construct the Notification object.

    Notification notif = new Notification(R.drawable.stat_sample, tickerText,

            System.currentTimeMillis());


    // Set the info for the views that show in the notification panel.

    notif.setLatestEventInfo(this, from, message, contentIntent);


    // We'll have this notification do the default sound, vibration, and led.

    // Note that if you want any of these behaviors, you should always have

    // a preference for the user to turn them off.

    notif.defaults = Notification.DEFAULT_ALL;


    // Note that we use R.layout.incoming_message_panel as the ID for

    // the notification.  It could be any integer you want, but we use

    // the convention of using a resource id for a string related to

    // the notification.  It will always be a unique number within your

    // application.

    nm.notify(R.string.imcoming_message_ticker_text, notif);

}


- 일반적인 UI flow 가 아닌 specific 한 Activity 로 바로 전환될 경우에는 보통 activity 에 launchMode="singleTask", android:taskAffinity="", android:excludeFromRecent="true" 를 옵션으로 주어, stack 이 꼬이지 않도록 해준다.




- Notification 에 FLAG_AUTO_CANCEL flag 를 설정해주면, 해당 Notification 이 click 되었을떄, Notification bar 에서 자동으로 사라진다.


- 이미 등록된 Notification 을 갱신하려면, setLatestEventInfo() 를 호출하여 내용갱신 후 notify() 를 다시 호출해주면 된다.


- Notification sound 추가는 notification.defaults 에 한다.

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

 

- 만약 Notification sound 가 확인 할 떄까지 계속 울려야 한다면 FLAG_INSISTENT flag 를 설정해주면 된다.


- notification.defaults 에 DEFAULT_SOUND 값이 있다면, 다른 값은 모두 무시되고 이 값이 유효하다.


- vibration 도 notification.defaults 에 설정한다. vibration pattern 은 notification.vibrate 에 long[] 값을 assign 해준다.


- vibration 도 sound 와 마찬가지로 DEFAULT_VIBRATE 값이 들어가 있다면, 나머지 설정은 무시된다.


- notification led control 은 notification.ledARGB, ledOnMs, ledOffMs, 로 control 하며 flag 는 Notification.FLAG_SHOW_LIGHTS 를 설정해 주어야 한다.


- FLAG_ONGOING_EVENT flag 가 설정되면, OnGoing 이라는 title 을 가진 notification window 에 notification 이 등록된다. ( 예 : 다운로드 )


- FLAG_NO_CLEAR 는 notification bar 의 "clear" 버튼에 의해 clear 되지 않는다.


- notification.number 는 event 의 갯수를 나타낸다. number 값은 1부터 시작해야 한다. 0이나 -1은 display 되지 않는다.


- notification.iconLevel 은 Drawable 들을 LevelListDrawable 에 명시하고, 이 drawable 을 바탕으로 notification icon 을 animation 한다.


- Notification 에 Custom View 를 적용할 때, style 을 사용하는 것이 좋다. 안드로이드 framework 마다 Notification 의 배경색이 다를 수 있기 때문이다. Android 2.3 부터는 default notification layout 에 대한 style을 제공한다. 이 default style 을 사용하면 쉽게 배경색과 어울릴 수 있다.


<?xml version="1.0" encoding="utf-8"?>

<resources>

    <style name="NotificationText">

      <item name="android:textColor">?android:attr/textColorPrimary</item>

    </style>

    <style name="NotificationTitle">

      <item name="android:textColor">?android:attr/textColorPrimary</item>

      <item name="android:textStyle">bold</item>

    </style>

    <!-- If you want a slightly different color for some text,

         consider using ?android:attr/textColorSecondary -->

</resources>


<!-- above GingerBread -->

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <style name="NotificationText" parent="android:TextAppearance.StatusBar.EventContent" />

    <style name="NotificationTitle" parent="android:TextAppearance.StatusBar.EventContent.Title" />

</resources>


- Notification 에 custom layout 을 적용할 경우에는, 공간제약이 있기 때문에 더 주의를 기울여야 한다. orientation 등의 여러가지 환경에서 제대로 표시되는지 반드시 확인해야 한다.






반응형

댓글