android status bar 之 status bar notifications

邢凌
2023-12-01
《视频: [Android开发从零开始].19.Status.Bar.Notifications》
http://v.youku.com/v_show/id_XMzg2OTI4MDcy.html
--------------------------------------------------------------------------------
视频: [Android开发从零开始]
http://i.youku.com/u/UMzk2MzE3Njc2/videos/order_1_view_2_page_3
--------------------------------------------------------------------------------
《Android开辟指南(38) —— Status Bar Notifications》
http://www.byywee.com/page/M0/S654/654171.html
--------------------------------------------------------------------------------
Android开辟指南(38) —— Status Bar Notifications
Admin
2011年12月12日
媒介
  本章内容为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),当用户点击时系统会执行此意图。
在本文中
    基础知识
    经管通知
    创建通知
        更新通知
        添加声音
        添加振动
        添加闪光
        其他特性
    创建自定义的通知Layout

关键类
    Notification
    NotificationManager


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

 

    当后台服务(Service)须要对某个事务发出提示并且须要用户响应时,状态栏通知就能阐扬感化了。后台服务从来不会启动Activity来接管用户的交互,取而代之的是应当创建一个status bar notification,当用户点选后再由notification来启动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在全部应用法度局限内独一标识Notification。Notification须要更新;应用法度可能经管着多种不合的通知,在用户经由过程各自定义的Intent返回应用法度时必须能选择正确的动作履行之,是以上述参数是必须的。

要实现用户从通知窗口内点选后主动清除状况栏通知,请在Notification对象中参加“FLAG_AUTO_CANCEL”标记。也可以传入通知ID用cancel(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 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、展开信息的题目和文本外,可以哄骗对象的成员值批改每个属性。要批改通知的文本信息,只能对contentTitle和contentText参数赋新值并调用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");

这时,已知有资料ID为6的媒体文件,并且已添加到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,200,300};

notification.vibrate = vibrate;

长整型数组定义了震动开和关瓜代的时候(毫秒)。第一个数是开端振动前的守候时候(震动封闭),第二个数是第一次开启振动的连气儿时候,第三个数是下一次封闭时候,如此类推。振动模式的连气儿时候没有限制,但不克不及设置为反复振动。

重视:若是defaults 属性包含了“DEFAULT_VIBRATE”,则缺省的震动模式将会覆盖vibrate 属性里指定的模式。

 

添加闪光

要想用LED闪光来提示用户,可以履行缺省闪光模式(若是可用的话),也可以自定义闪光的色彩和模式。

要应用缺省的闪光设置,给属性defaults 添加“DEFAULT_LIGHTS”即可:

notification.defaults |= Notification.DEFAULT_LIGHTS;

 

要自定义色彩和模式,则须指定ledARGB属性(指色彩)、ledOffMS属性(闪光封闭毫秒数)、ledOnMS属性(闪光开启毫秒数),并在“flags”属性里参加“FLAG_SHOW_LIGHTS”:

notification.ledARGB = 0 xff00ff00;

notification.ledOnMS = 300;

notification.ledOffMS = 1000;

notification.flags |= Notification.FLAG_SHOW_LIGHTS;

上例实现了绿色光闪烁300毫秒间歇1秒的闪光。每个设备的LED灯不成能支撑所有色彩的发光,不合的设备所能支撑的色彩也各不雷同,是以硬件将遵守最接近的色彩来发光。绿色是最常见的提示色。

 

其他特点

哄骗Notification的属性和标记位,可以给通知添加更多的特点。

下面列出了此中一些常用的特点:

“FLAG_AUTO_CANCEL”标记

在flags属性中增长此标记,则在通知窗口点选后能主动作废通知。

“FLAG_INSISTENT”标记

在flags属性中增长此标记,则在用户响应前一向轮回播放声音。

“FLAG_ONGOING_EVENT”标记

在flags属性中增长此标记,则将通知放入通知窗口的“正在运行”(Ongoing)组中。默示应用法度正在运行——过程仍在后台运行,即使应用法度不成见(比如播放音乐或接听德律风)。

“FLAG_NO_CLEAR”标记

在flags属性中增长此标记,默示通知不容许被“清除通知”按钮清除。这在期望通知对峙运行时希罕有效。

number属性

默示通知所代表的事务数量。此数字显示在状况栏图标上。要哄骗此属性,必须在第一次创建通知时设为1。(若是只是在更新通知时才把此值从0改成随便率性大于0的数,则数字不会显示出来。)

iconLevel属性

默示通知图标当前的LevelListDrawable等级。经由过程改变这个值,可以在状况栏中显示图标的动画,这个值与LevelListDrawable中drawable的定义相干。详情请参阅LevelListDrawable。

法度能自定义更多特点,详情请参阅Notification。

 

 

创建自定义的展开View

默认景象下,通知窗口中的展开视图(view)包含根蒂根基的题目和文本信息。这是由setLatestEventInfo() 的contentTitle和contentText参数指定的。不过仍可以用RemoteViews来自定义一个展开视图的布局。右侧的截图就显现了一个自定义展开视图的例子,此顶用到了LinearLayout 布局中的ImageView和TextView。

 

要自定义展开信息的布局,须要实例化一个RemoteViews对象,并将它传递给Notification的contentView属性,同时把PendingIntent传给contentIntent属性。

 

经由过程例子是对创建自定义展开视图最好的懂得体式格式:

1.         为展开视图新建XML布局,建树一个名为custom_notification_layout.xml的布局文件,内容如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

              android:orientation="horizontal"

              android:layout_width="fill_parent"

              android:layout_height="fill_parent"

              android:padding="3dp"

              >

    <ImageView android:id="@+id/image"

              android:layout_width="wrap_content"

              android:layout_height="fill_parent"

              android:layout_marginRight="10dp"

              />

    <TextView android:id="@+id/text"

              android:layout_width="wrap_content"

              android:layout_height="fill_parent"

              android:textColor="#000"

              />

</LinearLayout>

此布局用于展开视图,但ImageView和TextView的内容还须要由应用法度来定义。RemoteViews供给了一些便利的办法来定义这些内容。

 

2.         在应用法度代码里,用RemoveViews的办法来定义图片和文字。然后把RemoteViews对象传给Notification的contentView属性,如下所示:

RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);

contentView.setImageViewResource(R.id.image, R.drawable.notification_image);

contentView.setTextViewText(R.id.text, "Hello, this message is in a custom expanded view");

notification.contentView = contentView;

如上:先把法度package名和布局资料ID传给RemoteViews的机关办法。然后用setImageViewResource()和setTextViewText()定义ImageView和TextView的内容,分别把View对象的资料ID、所赋的内容作为参数传入。最后,把RemoteViews对象传给Notification的contentView属性。

 

3.         因为自定义视图不须要履行setLatestEventInfo()办法,是以必须用contentIntent属性来定义一个通知所要履行的意图Intent ,如下:

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

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

notification.contentIntent = contentIntent;

 

4.         如今通知可以如常发送了:

mNotificationManager.notify(CUSTOM_VIEW_ID, notification);

 

RemoteViews类还包含了一些办法,便于在通知的展开视图里增长Chronometer或ProgressBar。关于用RemoteViews创建自定义布局的具体信息,请参阅RemoteViews 类的参考文档。

重视:当建树一个自定义展开视图时,必须希罕警惕,包管自定义的布局能正常工作在不合的设备标的目标和辨别率下。这个建议对于所有在Android上创建的View布局都是实用的,但在这种景象下尤为首要,因为布局实际可用的屏幕区域很是有限。不要把自定义布局设计得过于错杂,并且必然要在各类景象设备下进行测试。
















 类似资料: