Notification的功能与用法
Notification是显示在手机状态的通知——手机状态栏位于手机屏幕的最上方,那里一般显示了手机当前的网络状态、时间等。Notification所代表的是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification。
提示:NotificationManager是一个重要的系统服务,该API位于android的应用程序框架层,应用程序可通过NotificationManager向系统发送全局通知。
Android 3.0增加Notification.Builder类,通过该类允许开发者更轻松的创建Notification对象。Notification.Builder提供了如下常用方法。
- setDefaults():设置通知LED灯、音乐、振动等。
- setAutoCancel():设置点击通知后,状态栏自动删除通知。
- setContentTitle():方法设置通知标题。
- setContentText():设置通知内容。
- setSmallIcon():未通知设置图标。
- setLargeIcon():未通知设置大图标。
- setTick():设置通知在状态栏的提示文本。
- setContentIntent():设置点击通知后将要启动的程序组件对应的PendingIntent。
发送Notification很简单,按如下步骤进行即可。
- 调用getSystemService(NOTFICATION_SERVICE)方法获取系统的NotificationManager服务。
- 通过构造器创建一个Notification对象。
- 为Notification设置各种属性。
- 通过NotificationManager发送Notification。
实例:加薪通知
本实例示范了如何通过NotificationManager来发送、取消Notification,本实例的界面很简单,只是包含两个普通按钮,分别用于发送Notification和取消Notification。
本示例的界面布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送Notification" android:onClick="send"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除Notification" android:onClick="del"/> </LinearLayout>
该Activity程序的后台代码文件如下:
package org.crazyit.helloworld; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.app.Notification; import android.app.Notification.Builder; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; import android.view.Menu; import android.view.View; public class NotificationTest extends Activity { static final int NOTIFICATION_ID =0x123; NotificationManager nm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.notification_test); //获取系统的NotificationManager服务 nm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE); } //为发送通知的按钮的点击事件定义事件处理方法 public void send(View source) { //创建一个启动其他Activity的Intent Intent intent=new Intent(NotificationTest.this,OtherActivity.class); PendingIntent pi=PendingIntent.getActivity(NotificationTest.this, 0, intent, 0); Notification notify=new Notification.Builder(this) //设置打开该通知,该通知自动消失 .setAutoCancel(true) //设置显示在状态栏的通知提示信息 .setTicker("有新消息") //设置通知的图标 .setSmallIcon(R.drawable.notify) //设置通知内同的标题 .setContentTitle("一条新通知") .setContentText("恭喜您,您加薪了,工资增加20%!") //设置系统默认的声音、震动 //.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE) //设置通知的自定义声音 .setSound(Uri.parse("android.resource://org.craztit.ui"+R.raw.msg)) .setWhen(System.currentTimeMillis()) //设置盖通知将要启动程序的Intent .setContentIntent(pi) .build(); //发送通知 nm.notify(NOTIFICATION_ID,notify); } //为删除通知的按钮的点击事件定义事件处理方法 public void del(View v) { //取消通知 nm.cancel(NOTIFICATION_ID); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.notification_test, menu); return true; } }
上面的程序中粗体字代码用于为Notification设置各种属性,包括Notification的图标、标题、发送时间等。除此之外,上面的程序还通过setDefaults()方法为Notification设置了声音提示、振动提示、闪光灯等。该属性支持如下属性值。
- DEFAULT_SOUND:设置使用默认声音。
- DEFAULT_VIBRATE:设置默认振动。
- DEFAULT_LIGHTS:设置使用默认闪光灯。
- ALL:设置使用默认声音、振动、闪光灯。
如果不想使用默认设置,也可以使用如下代码:
//设置自定义声音 setSound("file///sdcard/click.mp3"); //设置自定义振动 setVibrate(new long[]{0,50,100,150});
运行上面的程序,单击程序中“发送Notification”按钮,将可以看到手机屏幕上方出现了一个Notification。将状态栏向下拖动,将可以看到Notification的详情,
上图中Notification还关联了一个Activity:OtherActivity,因此当用户单击“通知”时即可启动OtherActivity——OtherActivity是一个十分简单的程序,故此处不再介绍。
由于上面的程序指定了该Notification要启动OtherActivity,因此一定不要忘记在AndroidManifest.xml文件中声明该Activity。而且上面的程序中还需要访问系统闪光灯、振动器,这也需要在AndroidManifest.xml文件中声明权限。也就是增加如下代码片段即可。
<!-- 添加操作闪光灯的权限 --> <uses-permission android:name="android.permission.FLASHLIGHT" /> <!-- 添加操作振动器的权限 --> <uses-permission android:name="android.permission.VIBRATE" /> <activity android:name="org.crazyit.helloworld.OtherActivity" android:label="@string/title_activity_other" > </activity>