实现 Notification 的方法
1.获取 NotificationManager 实例管理通知
2.实例化 Notification 对象,构造通知内容
3.Intent 事件跳转管理
4.通过 NotificationManager 发送通知
这里我们把通知分为以下几种类型:
1.普通通知
2.悬停通知
3.折叠通知
4.带Tag标识的通知
构造通知首先需要获得 NotificationManager 实例,通过它来管理通知和发送通知。
NotificationManager mNotiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
1、普通通知
创建NotificationCompat.Builder 对象
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, channelId);
or
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
这两种实现方式第二种系统已经提示已过时,建议使用第一种方式
这里channelId是为了适配Android O,会涉及到NotificationChannel
NotificationChannel是Android O新增的特性,为了兼容老代码,如果channelId为null的话,Android O会把通知归到“Other Channel”上。需要注意的是如果将targetSdkVersion提到26以上的话,就必须设置channel了,不能为null。
这边先设置channelId 具体NotificationChannel 之后会用法介绍
接下来先进行创建Notification 的一些基本设置:
builder.setContentTitle("this is common notification title")
.setContentText("this is common notification content text")
.setDefaults(Notification.DEFAULT_ALL)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_launcher))
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setVisibility(NotificationCompat.VISIBILITY_PRIVATE)
.setVibrate(new long[]{100, 200, 300, 400})
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setLights(Color.YELLOW, 300, 0);
Intent skipIntent = new Intent(mContext, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, notificationId,
skipIntent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
以上设置了一些方法,具体有哪些作用,我们一一分析一下:
setContentTitle 设置通知标题
setContentText 设置通知内容
setDefaults 打开呼吸灯,声音,震动,触发系统默认行为
DEFAULT_VIBRATE 添加默认震动提醒 需要VIBRATE permission
DEFAULT_SOUND 添加默认声音提醒
DEFAULT_LIGHTS 添加默认三色灯提醒
DEFAULT_ALL 添加默认以上3种全部提醒
setSmallIcon 设置通知的小图标,只能使用纯 alpha 图层的图片进行设置,小图标会显示在系统状态栏上
setLargeIcon 设置通知图标,在下拉通知显示
setWhen 设置通知时间,默认为系统发出通知的时间,通常可以不用设置
setAutoCancel 设置点击通知后清除
setVisibility android5.0加入了一种新的模式Notification的显示等级,共有三种
1.VISIBILITY_PRIVATE : 显示基本信息,如通知的图标,但隐藏通知的全部内容;
2.VISIBILITY_PUBLIC : 显示通知的全部内容;
3.VISIBILITY_SECRET : 不显示任何内容,包括图标。
setVibrate 设置震动,需要配置权限(android.permission.VIBRATE)
setPriority setPriority() 方法共有5个等级:
1. PRIORITY_MIN - 最低级别(-2)
2. PRIORITY_LOW - 较低级别(-1)
3. PRIORITY_DEFAULT - 默认级别(0)
4. PRIORITY_HIGH - 较高级别(1)
5. PRIORITY_MAX - 最高级别(2) 当发出此类型的通知时,通知会以悬挂的方法显示在屏幕上
setLights 设置呼吸灯颜色,一般三种颜色:红,绿,蓝
PendingIntent 用与处理通知的交互事件(也就是点击事件)。PendingIntent表示的是一个待定的意图。
可以用于开启一个Activity,Service或广播接收者,它是对Intent的包装。对外部提供这个Intent.通知被点击时系统会按照PendingIntent设置的方法及Intent设置的目标去开启对应的Activity,Service或广播接收者
PendingIntent 主要可以通过以下三种方式获取:
//获取一个用于启动 Activity 的 PendingIntent 对象
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags);
//获取一个用于启动 Service 的 PendingIntent 对象
public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags);
//获取一个用于向 BroadcastReceiver 广播的 PendingIntent 对象
public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags)
setContentIntent 设置通知事件交互
发送通知
Notification notification = builder.build();
mNotiManager.notify(notificationId, notification);
悬停通知
通知到达的时候会在状态栏上方直接显示通知
builder.setTicker(content);
builder.setFullScreenIntent(pendingIntent, true);
setTicker 首次收到的时候,在状态栏中,图标的右侧显示的文字(设置之后可以显示悬停通知)
setFullScreenIntent 在5.0以上可以悬停之后可以正常收起,6.0以上会一直停留知道用户手动操作消失
设置悬停主要是以上两个方式,其他配置可以参考普通通知配置方式。
折叠通知
折叠通知需要通过** RemoteViews**来实现
RemoteViews collapsed = new RemoteViews(mContext.getPackageName(), R.layout.notify_collapsed);
RemoteViews show = new RemoteViews(mContext.getPackageName(), R.layout.notify_show);
builder.setCustomContentView(collapsed);
builder.setCustomBigContentView(show);
builder.setCustomHeadsUpContentView(collapsed);
以上设置几个参数分析:
setCustomContentView 设置自定义通知视图(折叠状态视图)
setCustomBigContentView 设置展开视图
setCustomHeadsUpContentView 设置在悬停的时候需要显示的视图,如果不设置,默认显示CustomBigContentView
设置Tag类型通知
对一些通知可以做一些标签分类,我们可以给通知加上tag作为一个区分
//发送通知
mNotiManager.notify(notiTag, notificationId, notification);
//取消通知,清除指定 TAG 和 ID 的通知
mNotiManager.cancel(tag, notificationId);
这两个方式需要成对出现,如果是通过NotificationManager.notify(String tag, int id, Notification notify) 方法创建的通知,那么只能通过 NotificationManager.cancel(String tag, int id) 方法才能清除对应的通知,调用NotificationManager.cancel(int id) 无效。
取消通知
取消通知主要有3个方式
//通过id取消通知
NotificationManager.cancel(int id);
//通过tag和id取消通知
NotificationManager.cancel(String tag, int id);
//取消全部通知
NotificationManager.cancelAll();
Android O 新特性 NotificationChannel
如果需要发送属于某个自定义渠道的通知,就需要在发送通知前创建自定义通知渠道
创建NotificationChannel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
/**
* channelId 全局必须是唯一的,并且长度不能太长
* channelName 渠道名称,显示在通知栏列表
* importance 渠道重要等级,等级不同在手机桌面上的展示不同。需要注意的是代码中设置的渠* 道重要等级只是一个初始值,用户可以手动更改渠道的重要等级
*/
NotificationChannel channel = new NotificationChannel(channelId, channelName,
NotificationManager.IMPORTANCE_HIGH);
channel.enableLights(true);
channel.enableVibration(true);
channel.setVibrationPattern(new long[]{100, 200, 300, 400});
channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
notificationManager.createNotificationChannel(channel);
}
NotificationChannel 的方法列表:
getId() — 获取 ChannleId
enableLights() — 开启指示灯,如果设备有的话
setLightColor() — 设置指示灯颜色
enableVibration() — 开启震动
setVibrationPattern() — 设置震动频率
setImportance() — 设置频道重要性
getImportance() — 获取频道重要性
setSound() — 设置声音
getSound() — 获取声音
setGroup() — 设置 ChannleGroup
getGroup() — 得到 ChannleGroup
setBypassDnd() — 设置绕过免打扰模式
canBypassDnd() — 检测是否绕过免打扰模式
getName() — 获取名称
setLockScreenVisibility() — 设置是否应在锁定屏幕上显示此频道的通知
getLockscreenVisibility() — 检测是否应在锁定屏幕上显示此频道的通知
setShowBadge() 设置是否显示角标
canShowBadge() — 检测是否显示角标
importance重要程度等级划分
IMPORTANCE_DEFAULT = 3; 会在状态栏中显示,允许有声音提示,但不会弹窗,通知下拉栏会展示
IMPORTANCE_HIGH = 4; 会弹窗提示,允许有提示音
IMPORTANCE_LOW = 2; 会在状态栏中显示,但不会弹窗,通知下拉栏会展示
IMPORTANCE_MAX = 5; 会弹窗提示,允许有提示音,可以使用全屏
IMPORTANCE_MIN = 1; 不提示,在通知下拉栏会展示,但是是收起的
IMPORTANCE_NONE = 0; 不提示,不展示
删除NotificationChannel
NotificationChannel mChannel = mNotificationManager.getNotificationChannel(id);
mNotificationManager.deleteNotificationChannel(mChannel);
通知demo