设计文档译文(http://adchs.github.io/patterns/notifications.html)
功能作用
1.显示接收到短消息、即使消息等信息 (如QQ、微信、新浪、短信)
2.显示客户端的推送消息(如有新版本发布,广告,推荐新闻等)
3.显示正在进行的事物(例如:后台运行的程序)(如音乐播放器、版本更新时候的下载进度等)
基本使用
public static NotificationManager getNotificationManager(Context context) {
NotificationManager instance = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
return instance;
}
public static Notification getNotification(Context context, Messager msg) {
Notification notification = new Builder(context)
.setContentTitle(msg.title)
.setContentText(msg.message)
.setContentIntent(getDefalutIntent(context, msg.action, Notification.FLAG_AUTO_CANCEL))
.setWhen(System.currentTimeMillis())// 通知产生的时间,会在通知信息里显示,一般是系统获取到的时间
//.setPriority(Notification.PRIORITY_DEFAULT) // 设置该通知优先级
.setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消
.setOngoing(false)// ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setDefaults(Notification.DEFAULT_VIBRATE)// 向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合
.build();// 设置通知小ICON .build();
notification.flags = Notification.FLAG_AUTO_CANCEL;
notification.icon = msg.icon;
return notification;
}
private static PendingIntent getDefalutIntent(Context context, String action, int flag) {
Intent intent = new Intent();
if(action.startsWith("http")){
Uri uri = Uri.parse(action);
intent = new Intent(Intent.ACTION_VIEW, uri);
} else {
}
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, flag);
return pendingIntent;
}
public static void sendNotification(Context context, Messager msg) {
getNotificationManager(context).notify(msg.id, getNotification(context, msg));
}
推荐使用(兼容性问题)(NotificationCompat)
public static Notification getNotification(Context context, Messager msg) {
int icon = 0;
try {
ApplicationInfo info = context.getPackageManager()
.getApplicationInfo(context.getPackageName(), 0);
icon = info.icon;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
Notification notification = new NotificationCompat.Builder(context)
.setContentTitle(msg.title)
.setContentText(msg.message)
.setSmallIcon(icon)
.setAutoCancel(true)
.setContentIntent(
getDefalutIntent(context, msg,
PendingIntent.FLAG_UPDATE_CURRENT))
.setWhen(System.currentTimeMillis())// 通知产生的时间,会在通知信息里显示,一般是系统获取到的时间
// .setPriority(Notification.PRIORITY_DEFAULT) // 设置该通知优先级
.setAutoCancel(true)// 设置这个标志当用户单击面板就可以让通知将自动取消
.setOngoing(false)// ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setDefaults(NotificationCompat.DEFAULT_VIBRATE)// 向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合
.build();// 设置通知小ICON .build();
return notification;
}
指定parent、独立存在(新task)
- 添加到 parent task
Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back
stackstackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent to the top of the stack
stackBuilder.addNextIntent(resultIntent);
// Gets a PendingIntent containing the entire back
stackPendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
...
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(id, builder.build());
- new Task
private static PendingIntent getDefalutIntent(Context context,
Messager msg, int flag) {
Intent intent = new Intent();
intent.putExtra(BKWebViewActivity.TITLE, msg.title);
intent.putExtra(BKWebViewActivity.URL, msg.url);
intent.putExtra(BKWebViewActivity.HTML, msg.html);
intent.setClassName(context, "packname.WebViewActivity");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, msg.id, intent, flag);
return pendingIntent;
}
RemoteViews 自定义布局
public static Notification getCustomNotification(Context context, Messager msg) {
Notification notification = new Notification();
RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.notify);
notification.contentView = remoteView;
notification.contentIntent = getDefalutIntent(context, msg.action, Notification.FLAG_AUTO_CANCEL);
remoteView.setOnClickPendingIntent(R.id.notify_layout, getDefalutIntent(context, msg.action, Notification.FLAG_AUTO_CANCEL));
return notification;
}