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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,326评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,228评论 1 304
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,979评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,489评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,894评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,900评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,075评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,803评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,565评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,778评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,255评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,582评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,254评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,151评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,952评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,035评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,839评论 2 277

推荐阅读更多精彩内容