notification之一

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

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


  Notification的一般用法
  取得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中的界面很接近呢?


  更好的控制Notification动画图标怎么做?
  和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:不可以清除
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值