用惯了Android的人在刚拿到iPhone的时候,总是会习惯性的用手指从状态栏往下拖一下,这都是给Notification闹的。
不过Notification也确实是1个不错的提示工具,不干扰正常的操作,事后还可以再翻看详细的内容,点击后还可以进入相关的画面查看更具体的内容。
今天我就以代码为主的形式来介绍Notification的使用,包括基本用法,自定义的View,以及更多的控制方法。
另一种Android中常用到的提示方法Toast的用法请参见《教程:在Android中使用Toast进行提示》
我们先看下Notification的几个主要组成部分:
Icon:不解释
Ticker Text:Notification刚出来的时候,在状态栏上滚动的字幕,如果很长,会自动分割滚动
Content Title:Notification展开后的标题
Content Text:Notification展开后的内容
Notification的一般用法
取得NotificationManager
创建Notification并且显示
这是最基本的应用,可以说除了找个合适的图标以外,其它都很简单。
使用自定义View的Notification
同Toast一样,我们也可以自已指定1个View来作为Notification展开后的显示内容,比如说在Android Market中下载的时候,Notification中会显示当前下载的进度,那么我们也来模拟1个这样的效果吧。
首先给出View的定义文件:
RelativeLayout的使用,可以参考:《教程:Android各种Layout特性和使用汇总(一)》接下来是Java代码片段: //Notification的滚动提示
注意以上代码中使用的是RemoteViews,而不是普通的View,另外使用的是PendingIntent而不是普通的Intent,这都说明了Notification是1个“远程”的东西,其中能够使用的控件是受限制的,比如说TableLayout就不能使用。看下效果图,是不是和Market中的界面很接近呢?
更好的控制Notification动画图标怎么做?
和selector类似,定义1个XML文件放在drawable下,下面是之前用到的stat_sys_download的定义:
如何更新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:不可以清除
不过Notification也确实是1个不错的提示工具,不干扰正常的操作,事后还可以再翻看详细的内容,点击后还可以进入相关的画面查看更具体的内容。
今天我就以代码为主的形式来介绍Notification的使用,包括基本用法,自定义的View,以及更多的控制方法。
另一种Android中常用到的提示方法Toast的用法请参见《教程:在Android中使用Toast进行提示》
我们先看下Notification的几个主要组成部分:
Icon:不解释
Ticker Text:Notification刚出来的时候,在状态栏上滚动的字幕,如果很长,会自动分割滚动
![](http://www.apkbus.com/data/attachment/forum/201202/07/111338wxqfqorj8f8qvzq5.jpg)
Content Text:Notification展开后的内容
![](http://www.apkbus.com/data/attachment/forum/201202/07/111021dtz76gj4sz555ti5.jpg)
![](https://i-blog.csdnimg.cn/blog_migrate/701d47d7bfba73f6b9c5dcd595d206b9.png)
取得NotificationManager
01
02
03
|
private
NotificationManager mNotificationManager;
mNotificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
|
创建Notification并且显示
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
//Notification的滚动提示
String tickerText =
"My notification, It's a long text! Hello World desiyo?"
;
//Notification的图标,一般不要用彩色的
int
icon = R.drawable.icon_02241_3;
//contentTitle和contentText都是标准的Notification View的内容
//Notification的内容标题,拖下来后看到的标题
String contentTitle=
"My notification"
;
//Notification的内容
String contentText=
"Hello World!"
;
//Notification的Intent,即点击后转向的Activity
Intent notificationIntent =
new
Intent(
this
,
this
.getClass());
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(
this
,
0
,
notificationIntent,
0
);
//创建Notifcation
Notification notification =
new
Notification(icon, tickerText, System.currentTimeMillis());
//设定Notification出现时的声音,一般不建议自定义
notification.defaults |= Notification.DEFAULT_SOUND;
//设定如何振动
notification.defaults |= Notification.DEFAULT_VIBRATE;
//指定Flag,Notification.FLAG_AUTO_CANCEL意指点击这个Notification后,立刻取消自身
//这符合一般的Notification的运作规范
notification.flags|=Notification.FLAG_AUTO_CANCEL;
notification.setLatestEventInfo(
this
, contentTitle, contentText, contentIntent);
//显示这个notification
mNotificationManager.notify(HELLO_ID, notification);
|
这是最基本的应用,可以说除了找个合适的图标以外,其它都很简单。
使用自定义View的Notification
同Toast一样,我们也可以自已指定1个View来作为Notification展开后的显示内容,比如说在Android Market中下载的时候,Notification中会显示当前下载的进度,那么我们也来模拟1个这样的效果吧。
首先给出View的定义文件:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
notification_view_sample.xml
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<RelativeLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:padding=
"3dp"
>
<ImageView android:id=
"@+id/notificationImage"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@android:drawable/stat_sys_download"
/>
<TextView android:id=
"@+id/notificationTitle"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_toRightOf=
"@id/notificationImage"
android:layout_alignParentRight=
"true"
android:paddingLeft=
"6dp"
android:textColor=
"#FF000000"
/>
<TextView android:id=
"@+id/notificationPercent"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_below=
"@id/notificationImage"
android:paddingTop=
"2dp"
android:textColor=
"#FF000000"
/>
<ProgressBar android:id=
"@+id/notificationProgress"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_below=
"@id/notificationTitle"
android:layout_alignLeft=
"@id/notificationTitle"
android:layout_alignParentRight=
"true"
android:layout_alignTop=
"@id/notificationPercent"
android:paddingLeft=
"6dp"
android:paddingRight=
"3dp"
android:paddingTop=
"2dp"
style=
"?android:attr/progressBarStyleHorizontal"
/>
</RelativeLayout>
|
RelativeLayout的使用,可以参考:《教程:Android各种Layout特性和使用汇总(一)》接下来是Java代码片段: //Notification的滚动提示
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
String tickerText1 =
"Custom view for download notification"
;
//Notification的图标,一般不要用彩色的
int
icon1 = android.R.drawable.stat_sys_download;
//Notification的Intent,即点击后转向的Activity
Intent notificationIntent1 =
new
Intent(
this
,
this
.getClass());
notificationIntent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent1 = PendingIntent.getActivity(
this
,
0
, notificationIntent1,
0
);
//创建Notifcation
Notification notification1 =
new
Notification(icon1, tickerText1, System.currentTimeMillis());
//设定Notification出现时的声音,一般不建议自定义
notification1.defaults |= Notification.DEFAULT_SOUND;
//设定是否振动
notification1.defaults |= Notification.DEFAULT_VIBRATE;
//notification.number=numbers++;
//指定Flag,Notification.FLAG_AUTO_CANCEL意指点击这个Notification后,立刻取消自身
//这符合一般的Notification的运作规范
notification1.flags|=Notification.FLAG_ONGOING_EVENT;
//创建RemoteViews用在Notification中
RemoteViews contentView =
new
RemoteViews(getPackageName(), R.layout.notification_view_sample);
contentView.setTextViewText(R.id.notificationTitle,
"Download:Facebook for android"
);
contentView.setTextViewText(R.id.notificationPercent,
"35%"
);
contentView.setProgressBar(R.id.notificationProgress,
100
,
35
,
false
);
notification1.contentView = contentView;
notification1.contentIntent=contentIntent1;
//显示这个notification
mNotificationManager.notify(CUSTOM_VIEW_ID, notification1);
|
注意以上代码中使用的是RemoteViews,而不是普通的View,另外使用的是PendingIntent而不是普通的Intent,这都说明了Notification是1个“远程”的东西,其中能够使用的控件是受限制的,比如说TableLayout就不能使用。看下效果图,是不是和Market中的界面很接近呢?
![](http://www.apkbus.com/data/attachment/forum/201202/07/111021xui55ozx71bromzr.jpg)
![](https://i-blog.csdnimg.cn/blog_migrate/5d3e3da614b68de9fe5f21efa6c13a48.png)
和selector类似,定义1个XML文件放在drawable下,下面是之前用到的stat_sys_download的定义:
01
02
03
04
05
06
07
08
09
10
|
<animation-list
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:oneshot=
"false"
>
<item android:drawable=
"@drawable/stat_sys_download_anim0"
android:duration=
"200"
/>
<item android:drawable=
"@drawable/stat_sys_download_anim1"
android:duration=
"200"
/>
<item android:drawable=
"@drawable/stat_sys_download_anim2"
android:duration=
"200"
/>
<item android:drawable=
"@drawable/stat_sys_download_anim3"
android:duration=
"200"
/>
<item android:drawable=
"@drawable/stat_sys_download_anim4"
android:duration=
"200"
/>
<item android:drawable=
"@drawable/stat_sys_download_anim5"
android:duration=
"200"
/>
</animation-list>
|
如何更新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:不可以清除