实现 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);orNotificationCompat.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);
作者:听话哥
链接:https://www.jianshu.com/p/f48a88af6acd