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 등의 여러가지 환경에서 제대로 표시되는지 반드시 확인해야 한다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] ActionBar 고급정보들. (5) | 2012.05.30 |
---|---|
[Android/안드로이드] ContentProvider 고급 정보 (0) | 2012.05.26 |
[Android/안드로이드] Toast (0) | 2012.05.25 |
[Android/안드로이드] Dialog 고급정보. (0) | 2012.05.25 |
[Android/안드로이드] Menu 에 대한 고급정보. (0) | 2012.05.25 |
댓글