用惯了Android的人在刚拿到iPhone的时候,总是会习惯性的用手指从状态栏往下拖一下,这都是给Notification闹的。
不过Notification也确实是1个不错的提示工具,不干扰正常的操作,事后还可以再翻看详细的内容,点击后还可以进入相关的画面查看更具体的内容。
今天我就以代码为主的形式来介绍Notification的使用,包括基本用法,自定义的View,以及更多的控制方法。
另一种Android中常用到的提示方法Toast的用法请参见《教程:在Android中使用Toast进行提示》
我们先看下Notification的几个主要组成部分:
Icon:不解释
Ticker Text:Notification刚出来的时候,在状态栏上滚动的字幕,如果很长,会自动分割滚动

Content Title:Notification展开后的标题
Content Text:Notification展开后的内容

Notification的一般用法
取得NotificationManager
1 | private NotificationManager mNotificationManager; |
2 | mNotificationManager = (NotificationManager) |
3 |
getSystemService(Context.NOTIFICATION_SERVICE); |
创建Notification并且显示
02 | String tickerText = "My notification, It's a long text! Hello World desiyo?" ; |
04 | int icon = R.drawable.icon_02241_3; |
08 | String contentTitle= "My notification" ; |
10 | String contentText= "Hello World!" ; |
13 | Intent notificationIntent = new Intent( this , this .getClass()); |
14 | notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); |
15 | PendingIntent contentIntent = PendingIntent.getActivity( this , 0 , |
16 |
notificationIntent, 0 ); |
19 | Notification notification = new Notification(icon, tickerText, System.currentTimeMillis()); |
21 | notification.defaults |= Notification.DEFAULT_SOUND; |
23 | notification.defaults |= Notification.DEFAULT_VIBRATE; |
26 | notification.flags|=Notification.FLAG_AUTO_CANCEL; |
27 | notification.setLatestEventInfo( this , contentTitle, contentText, contentIntent); |
29 | mNotificationManager.notify(HELLO_ID, notification); |
这是最基本的应用,可以说除了找个合适的图标以外,其它都很简单。
使用自定义View的Notification
同Toast一样,我们也可以自已指定1个View来作为Notification展开后的显示内容,比如说在Android Market中下载的时候,Notification中会显示当前下载的进度,那么我们也来模拟1个这样的效果吧。
首先给出View的定义文件:notification_view_sample.xml
01 | <? xml version = "1.0" encoding = "utf-8" ?> |
04 |
xmlns:android = "http://schemas.android.com/apk/res/android" |
05 |
android:layout_width = "fill_parent" |
06 |
android:layout_height = "fill_parent" |
09 |
< ImageView android:id = "@+id/notificationImage" |
11 |
android:layout_width = "wrap_content" android:layout_height = "wrap_content" |
12 |
android:src = "@android:drawable/stat_sys_download" |
14 |
< TextView android:id = "@+id/notificationTitle" |
16 |
android:layout_width = "wrap_content" android:layout_height = "wrap_content" |
17 |
android:layout_toRightOf = "@id/notificationImage" |
18 |
android:layout_alignParentRight = "true" |
19 |
android:paddingLeft = "6dp" |
21 |
android:textColor = "#FF000000" |
23 |
< TextView android:id = "@+id/notificationPercent" |
24 |
android:layout_width = "wrap_content" android:layout_height = "wrap_content" |
26 |
android:layout_below = "@id/notificationImage" |
27 |
android:paddingTop = "2dp" |
28 |
android:textColor = "#FF000000" |
30 |
< ProgressBar android:id = "@+id/notificationProgress" |
32 |
android:layout_width = "wrap_content" android:layout_height = "wrap_content" |
33 |
android:layout_below = "@id/notificationTitle" |
34 |
android:layout_alignLeft = "@id/notificationTitle" |
35 |
android:layout_alignParentRight = "true" |
37 |
android:layout_alignTop = "@id/notificationPercent" |
38 |
android:paddingLeft = "6dp" |
39 |
android:paddingRight = "3dp" |
40 |
android:paddingTop = "2dp" |
41 |
style = "?android:attr/progressBarStyleHorizontal" |
接下来是Java代码片段:
02 | String tickerText1 = "Custom view for download notification" ; |
04 | int icon1 = android.R.drawable.stat_sys_download; |
07 | Intent notificationIntent1 = new Intent( this , this .getClass()); |
08 | notificationIntent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); |
09 | PendingIntent contentIntent1 = PendingIntent.getActivity( this , 0 , notificationIntent1, 0 ); |
12 | Notification notification1 = new Notification(icon1, tickerText1, System.currentTimeMillis()); |
14 | notification1.defaults |= Notification.DEFAULT_SOUND; |
16 | notification1.defaults |= Notification.DEFAULT_VIBRATE; |
20 | notification1.flags|=Notification.FLAG_ONGOING_EVENT; |
23 | RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification_view_sample); |
24 | contentView.setTextViewText(R.id.notificationTitle, "Download:Facebook for android" ); |
25 | contentView.setTextViewText(R.id.notificationPercent, "35%" ); |
26 | contentView.setProgressBar(R.id.notificationProgress, 100 , 35 , false ); |
28 | notification1.contentView = contentView; |
29 | notification1.contentIntent=contentIntent1; |
32 | mNotificationManager.notify(CUSTOM_VIEW_ID, notification1); |
注意以上代码中使用的是RemoteViews,而不是普通的View,另外使用的是PendingIntent而不是普通的Intent,这都说明了Notification是1个“远程”的东西,其中能够使用的控件是受限制的,比如说TableLayout就不能使用。看下效果图,是不是和 Market中的界面很接近呢?

更好的控制Notification
动画图标怎么做?
和selector类似,定义1个XML文件放在drawable下,下面是之前用到的stat_sys_download的定义:
02 |
xmlns:android = "http://schemas.android.com/apk/res/android" |
03 |
android:oneshot = "false" > |
04 |
< item android:drawable = "@drawable/stat_sys_download_anim0" android:duration = "200" /> |
06 |
< item android:drawable = "@drawable/stat_sys_download_anim1" android:duration = "200" /> |
07 |
< item android:drawable = "@drawable/stat_sys_download_anim2" android:duration = "200" /> |
09 |
< item android:drawable = "@drawable/stat_sys_download_anim3" android:duration = "200" /> |
10 |
< item android:drawable = "@drawable/stat_sys_download_anim4" android:duration = "200" /> |
12 |
< item android:drawable = "@drawable/stat_sys_download_anim5" android:duration = "200" /> |
如何更新Notification?
注意到前面的代码中用到的CUSTOM_VIEW_ID,这是Notification的ID,如果2次弹出的Notification的ID相同,那么Notification就只会更新而不会再次滚动提醒。之前给出的ProgressBar是不会动的,利用这个方法就可以让它动起来(或者也可以直接调用RemoteView的set方法来直接更新?未试验)
如何自定义提示的声音和振动?
//自定义提示音
notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
//自定义振动方式
long[] vibrate = {0,100,200,300};
notification.vibrate = vibrate;
请注意:如果使用了DEFAULT_SOUND或DEFAULT_VIBRATE,则自定义的提示音和振动无效。
在类似于短消息的应用中如何提示数量?
使用Notification的number属性,默认为0,如果是1或更大的数字,则会在图标上覆盖显示这个数字。
notification.number=notificationNumber;
Flag的使用
notification有1个flag属性,除了DEFAULT_SOUND之外,还有几个很有用的属性。
FLAG_AUTO_CANCEL:自动清除Notification,前面的例子中有用到
FLAG_INSISTENT:提示音一直不停,直至用户响应(很吵吧!)
FLAG_ONGOING_EVENT:表示这是1个正在进行的任务,不可以清除,第2个例子中有用到
FLAG_NO_CLEAR:不可以清除