Android Notification 使用记录

实现 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

    原文作者:听话哥
    原文地址: https://www.jianshu.com/p/f48a88af6acd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞