继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android Notification 使用记录

慕的地10843
关注TA
已关注
手记 1081
粉丝 200
获赞 962

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


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP