参考:
- 通知
- TaskStackBuilder的用法
- PendingIntent的用法
- http://www.rogerblog.cn/2016/04/15/Android-N-Introducing-upgraded-Notifications/
- https://www.jianshu.com/p/d9fbcb0db013
一. 概念介绍
- NotificationId
用来唯一标识一条通知的id,更新通知时候会用到 - NotificationManager
用来管理通知的类,一般用来显示(notify),取消(cancel)通知,用getSystemService(Context.NOTIFICATION_SERVICE)
方法获取 - NotificationCompat.Builder
用来创建通知,并进行一系列设置的类 - PendingIntent
一种用来延迟启动Activity、Service、BroadCast的Intent,通过PendingIntent的getXXX获取启动Activity、Service等的PI对象 - TaskStackBuilder
创建一个人工的返回栈,用于点击通知之后启动的Activity按返回返回到其父Activity而不是返回到桌面
二. 通知必备的三要素
创建通知必须要有的三要素,说是三要素,但只有小图标是不可缺少的,缺少之后会crash,其他两者缺少的话通知照样能显示
- 小图标
小图标,通过setSmallIcon设置 - 标题
通知标题,通过setContentTitle设置 - 详细文本
通知内容,通过setContentText设置
三. 通知操作
点击通知后进行的操作,常用操作如下:
- 打开Activity
- 利用PendingIntent构建想打开的Activity
- 调用setContentIntent方法设置PI
- 暂停/继续下载
- 播放/暂停歌曲
- 自定义操作等
四. 通知优先级
通知优先级相当于是一个提示,用来告诉系统用哪种形式显示UI,有五种模式:-2到2;最高级别会以悬浮通知的形式显示
五. 创建简单通知的步骤
- 实例化NotificationCompat.Builder对象
- 创建点击通知要进行的操作(PendingIntent)
- 利用Builder对象对通知进行一系列设置
- 实例化NotificationManager对象
- 调用NotificationManager对象的notify对象发送通知
mBuilder = new NotificationCompat.Builder(this);//参数为Context的构造函数在android8.0以上版本中已弃用,要用Context,channel的构造函数
Intent resultIntent = new Intent(this, UpdateActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, REQ_CODE, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
.setContentTitle("Title")
.setContentText("Hello,World")
.setContentIntent(pi)
.setAutoCancel(true);
mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mManager.notify(NOTIFICATION_ID, mBuilder.build());
六. 带有扩展布局的通知
带有扩展布局的通知可以有一个展开的大视图,MIUI中可以通过双指下滑打开,原生系统中可以直接查看大视图
PS:Android4.1以上才可用,且不同Rom显示效果都不一样,以下截图均为原生效果
-
扩展布局种类:
-
InboxStyle:包含一系列String的大视图
- 方法列表:
- setBigContentTitle:展开之后的标题
- setSummaryText :对添加的String数据的总结,下图中的+3more就是
- addLine:添加一行数据
-
效果:
- 方法列表:
-
BigPictureStyle
- 方法列表:
- setBigContentTitle:下图中的This is big content title
- setSummaryText:下图中的This is summary text
- bigLargeIcon:下图中的右上角图标
- bigPicture:下图中的大图片
-
效果:
- 方法列表:
-
BigTextStyle
- 方法列表:
- bigText:要全部显示出来的content内容,下图中一长串文字就是
- setBigContentTitle:下图中This is big content title
- setSummaryText:下图中This is summary text
-
效果:通知显示的时候,对contentText默认是显示在一行的,而内容要是过多则省略,于是就出来了这个Style,会将所有文字都显示出来
- 方法列表:
-
MediaStyle
- 注意:在使用该style之前要添加依赖:
implementation 'com.android.support:support-media-compat:version'
- 方法列表:
- 效果:用来实现音乐播放器的Style
- 注意:在使用该style之前要添加依赖:
-
MessagingStyle
- 方法列表:
- 效果:可以在通知栏里面进行发消息等操作
-
DecoratedCustomViewStyle
- 方法列表:
- 效果:由系统装饰的自定义视图的通知样式。自定义通知,但不是完全的自定义,相当于利用系统的装饰进行自定义
-
DecoratedMediaCustomViewStyle
- 方法列表:
- 效果:
-
-
创建扩展布局通知的步骤:
- 和普通通知一样,实例化Builder,设置三要素
- 新建一个NotificationCompatStyle(Style就是用来设置展开布局的),给Style进行一系列对应的设置
- 调用Builder.setStyle方法设置style
- notify进行显示即可
七. 管理通知
八. 8.0通知渠道适配
前言:8.0对通知渠道进行了较为强硬的要求,不带有通知渠道的通知是不会显示的了。因此要创建通知渠道对其进行适配
- 创建通知渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//创建了两个通知渠道,聊天信息和推送信息。两个渠道的优先级不同
createNotificationChannel(CHAT_NOTIFICATION_CHANNEL, "聊天消息", NotificationManager.IMPORTANCE_HIGH);
createNotificationChannel(SUBSCRIPTION_NOTIFICATION_CHANNEL, "推送信息", NotificationManager.IMPORTANCE_DEFAULT);
}
/**
* 创建通知渠道
* @param id 渠道id,可以为任意字符串。保证全局唯一性即可
* @param name 通知渠道名称,会显示给用户,用户可以对该渠道进行操作
* @param importance 通知渠道优先级
*/
@RequiresApi(api = Build.VERSION_CODES.O)
private void createNotificationChannel(String id, String name, int importance) {
NotificationChannel channel = new NotificationChannel(id, name, importance);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
}
- 创建通知的时候指定通知渠道
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Toast.makeText(this, "8.0以上", Toast.LENGTH_SHORT).show();
Notification notification = new Notification.Builder(this,CHAT_NOTIFICATION_CHANNEL)//就在这里指定渠道
.setSmallIcon(R.mipmap.ic_launcher_round)
.setContentTitle("聊天消息")
.setContentText("今天中午吃啥")
.setWhen(System.currentTimeMillis())
.build();
manager.notify(1, notification);
} else {
Toast.makeText(this, "8.0以下", Toast.LENGTH_SHORT).show();
Notification notification = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setContentTitle("聊天消息")
.setContentText("今天中午吃啥")
.setWhen(System.currentTimeMillis())
.build();
manager.notify(1, notification);
}