现在的位置: 首页 > 综合 > 正文

通知栏提示 Status Bar Notifications

2013年08月31日 ⁄ 综合 ⁄ 共 5352字 ⁄ 字号 评论关闭

前言

  本章内容为Android开发者指南的 Framework Topics/User Interface/Notifications/Status Bar Notifications章节,译为"状态栏通知",版本为Android 4.0 r1,翻译来自:"呆呆大虾",欢迎访问他的微博:"http://weibo.com/popapa",再次感谢"呆呆大虾"
!期待你一起参与翻译Android的相关资料,联系我over140@gmail.com。

 

声明

  欢迎转载,但请保留文章原始出处:) 

    博客园:http://www.cnblogs.com/

    Android中文翻译组:http://androidbox.sinaapp.com/

 

 

状态栏通知

译者署名: 呆呆大虾

译者微博:http://weibo.com/popapa

版本:Android 4.0 r1

原文

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

 

快速查看

·            状态栏(status
bar
)通知允许应用程序以不干扰当前activity的方式将事件通知用户。

·            可以给通知绑定一个意图(intent),当用户点击时系统会执行此意图。

在本文中

基础知识

管理通知

创建通知

更新通知

添加声音

添加振动

添加闪光

其他特性

创建自定义的展开View

关键类

Notification

NotificationManager

 

状态栏(status bar)通知将一个图标填加到系统的状态栏中(包含一条可选的提示文本信息),并将一条展开信息添加到通知窗口中。当用户选中展开信息时,Android将执行一个此通知已定义的意图Intent(通常用于弹出一个Activity)。你还可以对通知进行配置,用设备提供的声音、振动、闪光来提醒用户。

 

当后台服务(Service)需要对某个事件发出提醒并且需要用户响应时,状态栏通知就能发挥作用了。后台服务从来不会启动Activity来接收用户的交互,取而代之的是应该创建一个状态栏通知,在用户点选后再由通知来启动Activity

 

以下截图展示了一个左侧带有通知图标的状态栏:

 

下图展示了“Notifications”窗口内的通知展开信息。用户可通过下拉状态栏(或在Home菜单里选中通知)来显示这个通知窗口。

 

 

基础知识

Activity或者Service都能初始化一个状态栏通知。可因为Activity只有在活动状态并获得焦点时才能执行操作,所以还是建议用Service来创建状态栏通知。这样,即使用户正在使用其他程序或者设备已经休眠时,仍然可以从后台创建通知。要创建一个通知,须用到两个类:Notification类和NotificationManager类。

Notification类的一个实例来定义状态栏通知的属性,比如图标、展开信息,以及播放声音等附属设置。NotificationManager是一个Android系统服务,用于管理和运行所有通知。NotificationManager不能被实例化,为了把Notification传给它,你可以用getSystemService()方法获取一个NotificationManager的引用。在需要通知用户时再调用notify()方法将Notification对象传给它。

 

要创建一个状态栏通知:

1.         获取NotificationManager的引用:

String ns = Context.NOTIFICATION_SERVICE; 

NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

2.         实例化Notification

int icon = R.drawable.notification_icon; 

CharSequence tickerText = "Hello"; 

long when = System.currentTimeMillis(); 

Notification notification = new Notification(icon, tickerText, when);

3.         指定通知的展开信息和Intent

Context context = getApplicationContext(); 

CharSequence contentTitle = "My
notification"
; 

CharSequence contentText = "Hello
World!"
; 

Intent notificationIntent = new Intent(this, MyClass.class); 

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 

notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

4.         Notification对象传给NotificationManager

private static final int HELLO_ID = 1;  

mNotificationManager.notify(HELLO_ID, notification);

好了,现在用户已经能看到通知了。

 

 

管理通知

系统服务NotificationManager管理着所有的通知,只能通过getSystemService()方法来获取它的引用。例如:

String ns = Context.NOTIFICATION_SERVICE; 

NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

如果想要发送状态栏通知,通过notify(int,
Notification)
传递Notification对象给NotificationManager即可。第一个参数是Notification 的唯一ID,第二个参数是Notification对象。ID在整个应用程序范围内唯一标识NotificationNotification需要更新;应用程序可能管理着多种不同的通知,在用户通过各自定义的Intent返回应用程序时必须能选择正确的动作执行之,因此上述参数是必需的。

要实现用户从通知窗口内点选后自动清除状态栏通知,请在Notification对象中加入“FLAG_AUTO_CANCEL”标志。也可以传入通知IDcancel(int)手动清除,或者用cancelAll()清除所有你创建的通知。

 

 

创建通知

Notification对象定义了通知消息显示在状态栏和通知窗口上的细节内容,以及其他提醒设置(比如:声音、闪光等)。

 

状态栏通知必须包括以下内容:

·       状态栏图标

·       展开窗口view的标题和展开信息(除非用了自定义展开view

·       PendingIntent,当通知被点选时执行

 

状态栏通知的可选设置包括:

·       状态栏提示信息

·       提醒声音

·       震动设置

·       LED灯闪光设置

 

Notification的基础库(译者注:原文是starter-kit,但综合上下文并非初学者套件的意思,这里译为基础库)里包含了构造方法Notification(int,
CharSequence, long)
setLatestEventInfo(Context,
CharSequence, CharSequence, PendingIntent)
方法。这已经可以定义Notification的所有设置。以下代码段演示了对通知基本的设置:

int icon = R.drawable.notification_icon;  
     
// icon from resources 

CharSequence tickerText = "Hello";  
           
// ticker-text 

long when = System.currentTimeMillis();  
      
// notification time 

Context context = getApplicationContext();  
   
// application Context 

CharSequence contentTitle = "My
notification"
; // expanded message title 

CharSequence contentText = "Hello
World!"
;      // expanded message text 

 

Intent notificationIntent = new Intent(this, MyClass.class); 

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 

 

// the next two lines initialize the Notification, using the configurations above 

Notification notification = new Notification(icon, tickerText, when); 

notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

 

更新通知

应用程序可以在事件正在进行时更新状态栏通知。比如,前一条短信还未读,可又来了一条新短信,短信程序为了正确显示未读短信的总数,可以更新已有的通知。此时,更新原有通知要比向NotificationManager新增一条通知更合理些,因为避免了通知窗口的显示混乱。

因为NotificationManager对每个通知都用一个整数ID进行了唯一标识,新的通知内容可以用setLatestEventInfo()方法方便地进行修改,然后再次调用notify()显示出来。

除了Context、展开信息的标题和文本外,可以利用对象的成员值修改每个属性。要修改通知的文本信息,只能对contentTitlecontentText参数赋新值并调用setLatestEventInfo()然后再调用notify()方法来更新通知。(当然,如果已经创建了自定义扩展view,那么标题和文本的修改就无效了)。

 

添加声音

可以用缺省提示音(由用户指定)或者程序指定声音来提醒用户。

要使用用户缺省提示音,给defaults属性添加“DEFAULT_SOUND”

notification.defaults |= Notification.DEFAULT_SOUND;

 

要使用应用程序指定的声音,则传递一个Uri引用给sound属性。以下例子使用已保存在设备SD卡上的音频文件作为提示音:

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

 

在下面的例子里,音频文件从内部MediaStore类的ContentProvider中获取:

notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");

这时,已知有资源ID6的媒体文件,并且已添加到Uri内容中。如果不知道确切的ID,则必须先用ContentResolver查询MediaStore中所有可用的资源。关于使用ContentResolver的详细信息请参阅Content
Providers
文档。

如果期望在用户响应通知或取消通知前,声音一直持续循环播放,可以把 “FLAG_INSISTENT” 加入flags属性中。

注意:如果defaults属性包含了“DEFAULT_SOUND”,则缺省提示音将覆盖sound 属性里指定的声音。

 

添加振动

可以用缺省震动模式或程序指定的振动模式来提醒用户。

要用缺省震动模式,给属性defaults 添加“DEFAULT_VIBRATE” 即可:

notification.defaults |= Notification.DEFAULT_VIBRATE;

要自定义震动模式,须给vibrate属性传递一个long 类型的数组:

long[] vibrate = {0,100,

抱歉!评论已关闭.