最基本的通知
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
builder.setContentTitle("notification")
.setContentText("this is content")
.setSmallIcon(R.mipmap.ic_launcher);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(NOTIFICATION_ID,buidler.build());
说明
- 通常会选择用
NotificationCompat
来构建一个通知,以保证兼容性。 - 一个通知必须为其设置上面的三个属性。但是我们自己通过ReomteViews来自定义通知布局时,可以不用设置前两个属性,但是必须
setSmallIcon
。 -
NotificationManager
有两个nofify()
方法.notify(int id, Notification notification)
,notify(String tag, int id, Notification notification)
,其中tag和id用来唯一标识一个通知。
一般混合通知
下面这个通知是一个长文本通知。包括两个按钮,并且可以响应用户点击事件。内容比较杂。
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/"));
PendingIntent pendingIntent = PendingIntent.getActivity(mContext,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
Intent sendMessage = new Intent(Intent.ACTION_VIEW,Uri.parse("sms:10086"));
PendingIntent smpd = PendingIntent.getActivity(mContext,0,sendMessage,PendingIntent.FLAG_UPDATE_CURRENT);
// 为通知设置长文本样式
android.support.v4.app.NotificationCompat.BigTextStyle style = new android.support.v4.app.NotificationCompat.BigTextStyle();
style.bigText(getResources().getString(R.string.note_text));
style.setSummaryText("English Text");
builder.setContentTitle("notification")
.setContentText("this is content")
.setSmallIcon(R.drawable.github)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.github))
.setTicker("hello")
.setDefaults(Notification.DEFAULT_ALL)
.setSound(Uri.parse("android:resource://" + context.getPackageName() + "/" + R.raw.msg))
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setPriority(Notification.PRIORITY_MAX)
.setStyle(style)
.addAction(R.drawable.accept,"send",smpd)
.addAction(R.drawable.decline,"cancel",null);
Notification notification = builder.build();
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(NOTIFICATION_ID,buidler.build());
说明
- 通过
PendingIntent
来包装Intent
,然后调用builder的setContentIntent
方法把PendingIntent
传进去,响应用户的点击事件。 - 通过
setStyle
来设置通知的样式。例如可以设置BigTextStyle
,还可以设值MediaStyle
。 - 通过
addAction
方法来给通知添加按钮,并设值响应事件。
带进度条的通知
final NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
builder.setContentTitle("Downloading")
.setSmallIcon(R.mipmap.ic_launcher);
new Thread(new Runnable() {
@Override
public void run() {
for (int i =0;i<100;i+=10){
// 第三个参数如果设置为true,则不会显示精确的进度。
builder.setProgress(100,i,false);
manager.notify(NOTIFICATION_ID,builder.build());
try {
// 模拟下载
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
builder.setContentText("Complete")
// 取消进度条
.setProgress(0,0,false);
manager.notify(NOTIFICATION_ID,builder.build());
}
}).start();
自定义布局通知
自定义布局同时主要是通过ReomteViews
来实现.
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext);
// 为RemotViews设置一个布局,这个布局需要自己在layout中实现。
RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.notification);
remoteViews.setTextViewText(R.id.text,"notification");
remoteViews.setImageViewResource(R.id.image,R.drawable.git);
builder.setSmallIcon(R.drawable.github);
// 将RemoteViews设置到通知中
builder.setContent(remoteViews);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(NOTIFICATION_ID,builder.build());
补充
-
RemoteViews
是一个可以运行在其他进程中的View
。通知是运行在系统进程的。 - 如果需要为
RemoteViews
中的子View设置响应事件,可以通过remoteViews.setOnClickPendingIntent
方法实现。 - 上面通知的RemoteViews中有个TextView,如果要为它设置样式,可以在xml文件里添加一句
android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title"
,这样它的样式就和系统一致了。
悬挂式通知
通知有五种优先级,范围从 PRIORITY_MIN (-2) 到 PRIORITY_MAX (2),如果未设置,则优先级默认为 PRIORITY_DEFAULT (0)。
通过NotificationCompat.Builder.setPriority()
来为通知设置优先级。当优先级大于默认的时候时,通知都可以在其他应用的上面,显示一个顶部悬挂的通知。
通知的等级
通知的等级有三个
- VISIBILITY_PRIVATE, 表明当前通知只有在没有锁屏的时候才会显示。
- VISIBILITY_PUBLIC, 任何情况下都可以显示。
- VISIBILITY_SECRET, 在没有锁屏的情况下才会显示。
通过NotificationCompat.Builder.setVisibility(VISIBILITY_PUBLIC)
,可以让通知在锁屏界面上显示。
通过NotificationCompat.Builder.setCategory(Notification.CATEGORY_MESSAGE)
,可以控制通知的位置。