通知是应用程序通知用户的一种方式,它无须活动,由通知管理器进行统一管理。通知包含一下功能:
1. 创建新的状态栏图标
2. 在扩展的状态栏窗口显示额外的信息(可以发起一个意图)
3. 闪烁/LED
4. 让手机震动
5. 发出声音(铃声,媒体库歌曲)
通知管理器是用来处理通知的系统服务,使用getSystemService方法可以获得对它的引用。通过使用通知管理器,可以触发新的通知,修改现有的通知或者删除那些不再需要的通知。
首先创建一个新的Notification对象并传递给它要在状态栏显示的图标、状态栏的点击文本以及这个通知的时间。
可以设置Notification对象的number属性来显示一个状态栏图标所表示的事件的数量。
可以通过两张方式在扩展的状态窗口配置通知的外观。
1. 使用setLatestEventInfo方法更新标准的扩展的状态通知显示中所显示的详细信息。
2. 使用一个远程视图(Remote View)设置contentView和contentIntent,以便为扩展的状态显示分配一个定制的UI。
最简单的方法是使用setLatestEventInfo方法来填充默认的状态窗口布局。标准的扩展的状态窗口布局会显示构造函数中定义的图标和时间,以及标题和一个详细信息字符串。
通知常用于请求用户的动作或注意,所以可以指定一个PendingIntent,当用户单击通知项的时候触发它,在大多数情况下,该意图应该打开应用程序,并导航到为通知提供了上下文的活动。
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
int icon = R.drawable.play;
String tickerText = getResources().getString(
R.string.notification);
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText,
when);
notification.number++;
notification.setLatestEventInfo(getApplicationContext(),
"通知测试", tickerText,PendingIntent.getActivity(
MainActivity.this, 0, new Intent(
Intent.ACTION_CALL_BUTTON), 0));
manager.notify(11,notification);
如果标准的扩展视图中可用的详细信息不能满足通知的要求,那么可以创建自己的布局,并使用远程视图把它分配给通知。
<?xml version="1.0"encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:padding="5dp"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/status_icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="10px"
android:layout_toRightOf="@id/status_icon">
<TextView
android:id="@+id/status_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:textColor="#000"
android:textSize="14sp"
android:textStyle="bold"
/>
<ProgressBar
android:id="@+id/status_progress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/status_text"
android:progressDrawable="@android:drawable/progress_horizontal"
android:indeterminate="false"
android:indeterminateOnly="false"
/>
</RelativeLayout>
</RelativeLayout>
要将定制布局分配给通知,可以创建一个新的RemoteView对象,并把它分配给contentView属性。还需要向contentIntent属性分配一个待处理的意图(PendingIntent)。
NotificationManager manager =(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.play,"Custom Content",System.currentTimeMillis());
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
notification.contentView = new RemoteViews(getPackageName(), R.layout.niti);
Intent intent = new Intent();
intent.setData(Uri.parse("tel:13070116326"));
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
notification.contentIntent = pi;
notification.contentView.setImageViewResource(R.id.status_icon, R.drawable.icon);
notification.contentView.setTextViewText(R.id.status_text, "徐志奇测试");
notification.contentView.setProgressBar(R.id.status_progress, 100, 50, false);
manager.notify(12,notification);
当手动设置contentView属性时,必须同时也设置contentIntent,否则在触发通知的时候会抛出一个异常。
远程视图这种机制使你能够在一个独立的应用程序内嵌入和控制一个布局,这种情况多见于创建主屏幕小组件时。
要触发一个通知,需要把它和一个整形的引用ID一起传递给NotificationManager的notify方法。
要更新一个已经被触发的通知,需要使用通知管理器重新触发它,并传递给notify方法相同的ID。即可以传递给它一个相同的notification对象,也可以床底给它一个全新的Notification对象。只要ID值是相同的,那么新的Notification就会被用来代替状态栏图标以及展开的状态窗口中的内容。
可以使用cancel(id)的方法来取消Notification。
向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合:
Notification.DEFAULT_LIGHTS
Notification.DEFAULT_SOUND
Notification.DEFAULT_VIBRATE
如果想全部使用默认值,可以使用Notification.DEFAULT_ALL常量。
Notification.defaults =Notificaiton.DEFAULT_ALL;
通过向sound属性分配一个位置URI,android可以将手机上的任意音频文件作为通知进行播放。要使用自己定制的音频,需要把它复制到设备上,或者把它包含在原始资源(raw)中。
Uri uri =RingtoneManager.getDefaultUri(RingtongManager.TYPE_NOTIFICATION);
Notification.sound=uri;
可以使用电话的振动功能,让通知执行指定类型的振动。Android可以控制振动的类型,可以使用振动来传递信息或者吸引用户的注意。
要设置振动类型,可以向通知的vibrate属性分配一个longs类型的数组:构造该数组,可以使得代表振动时间的值和代表暂停时间的值交替存在。使用振动必须添加权限:
<uses-permissionandroid:name=”android.permission.VIBRATE”/>
Long[] vibrate = newlong[]{1000,1000,1000,1000,1000};
notification.vibrate=vibrate;
通知还可以包含用来配置设备的LED的颜色和闪烁频率的属性。
每个设备在对LED的控制方面可能具有不同的限制。如果指定的颜色可用,则将使用一个与指定颜色最接近的颜色。
ledARGB属性可以用来设置LED颜色,而ledOffMS和ledOnMS属性则可以设置LED闪烁的频率和模式。可以通过把ledOnMS属性设置为1,并且把ledOffMS设置为0来打开LED,或者也可以通过把这两个属性都设置为0来关闭LED。
一旦配置了LED设置,就必须在通知的flags属性中添加FLAG_SHOW_LIGHTS标记。
notification.ledARGB = Color.RED
notification.ledOffMS = 0;
notification.ledOnMS = 1;
notification.flags = notification.flags |Notification.FLAG_SHOW_LIGHTS;
通过设置通知的FLAG_INSISTENT和FLAG_ONGOING_EVENT标记,可以把它配置为持续的或者连续的。
持续的通知会一直重复音频、振动和闪灯设置,只到被取消为止。