一 Notification的类别

1.状态栏和抽屉式通知

  //获取NotificationManager对象
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager val intent = Intent(NotificationActivity@this,MainActivity::class.java)
//PendingIntent.FLAG_ONE_SHOT 多次创建也只能使用一次
val pendingIntent = PendingIntent.getActivity(NotificationActivity@this,0,intent,PendingIntent.FLAG_ONE_SHOT) //通道id 该id需要和创建NotificationChannel指定的id一致
val channelId = "komine.demos.app" //创建Notification对象
val notification = Notification.Builder(NotificationActivity@this,channelId) //channelId
//通知的文字内容
.setContentTitle("NotificationContentTitle")
//通知的正文内容
.setContentText("NotificationContent")
//Android8.0+提供的badge通知数字,默认只会显示一个圆点,需要长按应用图标才能看到设置的数字
.setNumber(39)
//pendingIntent 提供点击通知之后执行的动作,比如打开一个Activity
.setContentIntent(pendingIntent)
//设置通知左上角显示的图标,该图标不能太大,否则不正常显示,而且要是纯色的
.setSmallIcon(R.mipmap.notification)
//通知的大图标
.setLargeIcon(BitmapFactory.decodeResource(resources,R.mipmap.ic_launcher))
//.setContent() //已过时,换成setCustomContentView() 设置自定义的布局View
//设置自定义布局
.setCustomContentView()
////设置为true,当用户点击的时候自动消失
.setAutoCancel(false)
//设置左上角图片的颜色 即setSmallIcon图片的颜色
.setColor(Color.RED)
//可以理解为内容的样式,比如要放一张图片,一段文字或者媒体播放控制等,效果见下图
.setStyle(Notification.BigPictureStyle().bigPicture(bitmap))
//显示一个进度条,参数1:最大值,参数2:当前进度,参数3:循环效果
.setProgress(100,39,false)
.build() //如果运行在Android8.0+ 需要指定NotificationChannel,并且在Notification.Builder中指定指定channelId
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
//在8.0+需要创建一个通知渠道,才能发送通知
val notificationChannel = NotificationChannel(channelId,"一般通知",NotificationManager.IMPORTANCE_HIGH)
notificationManager.createNotificationChannel(notificationChannel)
} //最后调用notify方法显示通知 参数一:tag可以随便填,参数二:通知的重要级别,参数三:Notification对象
notificationManager.notify("",NotificationManager.IMPORTANCE_NONE,notification)
  .setProgress(100,39,false)

  .setProgress(100,39,true)

  .setNumber(39)

  .setColor(Color.RED)

  .setStyle(Notification.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(resources,R.mipmap.miku)))

  .setStyle(Notification.BigTextStyle().bigText("这是一段很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的文字"))

2.提醒式通知/顶部悬浮通知

跟一般通知的用法一致

Android8.0+ 在创建NotificationChannel的时候指定为 NotificationManager.IMPORTANCE_HIGH

  val notificationChannel = NotificationChannel(channelId,"一般通知",NotificationManager.IMPORTANCE_HIGH)

Android8.0以下

  .setFullScreenIntent(pendingIntent,true)
//或者在显示对话框的时候指定,8.0+必须在NotificationChannel指定
notificationManager.notify("",NotificationManager.IMPORTANCE_HIGH,notification)

3. 适配Android11 MediaStyle类型的Notification

Android11修改了MediaStyle类型通知栏的展示效果,如下图

可以看到,音频类型的Notification会在最上方显示,而且下拉可以展开更多选项.点击按钮也会有水波纹效果.

国内的音乐app适配Android11的特性的应用很少,QQ音乐,酷狗音乐这些大厂的应用都是没有适配的(2022-04-29)

下面说一下怎么适配Android11,实现这种效果

要实现这个效果,需要将通知的类型设置MeidaStyle样式才能实现

val style = Notification.MediaStyle()

还需要MediaSession,注意这个类在整个应用只能有一个实例,不然依赖它实现的功能的类会出现没效果的情况,比如MediaButton

val mediaSession = MediaSession(this, "komine.app.demo2")

mediaSession.setPlaybackState(
PlaybackState.Builder()
.setState(PlaybackState.STATE_PLAYING, 0, 1f)
.build()
) mediaSession.setMetadata(
MediaMetadata.Builder()
.build()
)

将MediaSession和MediaStyle关联

style.setMediaSession(mediaSession.sessionToken)

创建一个Notification查看效果

val notification = Notification.Builder(this, channelId)
.setSmallIcon(R.mipmap.music)
.setStyle(style)
.setContentTitle("棠梨煎雪")
.setContentText("银临")
.setLargeIcon(BitmapFactory.decodeResource(resources,R.mipmap.album))
.build() val notificationChannel = NotificationChannel(
channelId,
"音乐播放",
NotificationManager.IMPORTANCE_DEFAULT
) notificationManager.createNotificationChannel(notificationChannel) notificationManager.notify(0, notification)

但是并没有播放控制按钮,接下来添加播放、上一曲、下一曲按钮

在MediaStyle类型的通知中,要显示的按钮被称为一个Action,它包含图片,文字和PendingIntent.

val mPlayAction = Notification.Action.Builder(playIcon, "文字描述(不可见)", PendingIntent.getBroadcast(mContext, NOTIFICATION_ACTION_REQUEST_CODE, Intent("你要填的Action"), PendingIntent.FLAG_UPDATE_CURRENT)).build()

调用setShowActionsInCompactView()设置要显示的Action数量,要显示多个Action时必须是连续的三个数字,不然只显示一个

style.setShowActionsInCompactView(0)

显示多个,最多三个

style.setShowActionsInCompactView(0,1,2)

然后将Action添加到Notification,调用NotificationBuilder.addAction或者setActions()

.setActions(playAction.build())

未展开时最多只能显示三个Action

要实现点击按钮播放,上一首、下一首的功能可以参考我的另一篇博客

Android蓝牙线控切歌、连接状态监听(无线耳机也适用)

完整代码

fun showNotification(view: View) {
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val style = Notification.MediaStyle() val mediaSession = MediaSession(this, "komine.app.demo2") val channelId = "komine_media_play" val playAction = Notification.Action.Builder(R.mipmap.play, "播放", PendingIntent.getBroadcast(this, 0, Intent("PLAY_PAUSE_ACTION"),PendingIntent.FLAG_UPDATE_CURRENT)) val nextAction = Notification.Action.Builder(R.mipmap.next, "下一首", PendingIntent.getBroadcast(this, 0, Intent("NEXT_ACTION"), PendingIntent.FLAG_UPDATE_CURRENT)) val prevAction = Notification.Action.Builder(R.mipmap.prev, "上一首", PendingIntent.getBroadcast(this, 0, Intent("PREV_ACTION"), PendingIntent.FLAG_UPDATE_CURRENT)) mediaSession.setPlaybackState(
PlaybackState.Builder()
.setState(PlaybackState.STATE_PLAYING, 0, 1f)
.build()
) mediaSession.setMetadata(
MediaMetadata.Builder()
.build()
) style.setShowActionsInCompactView(0,1,2) style.setMediaSession(mediaSession.sessionToken) val notification = Notification.Builder(this, channelId)
.setSmallIcon(R.mipmap.music)
.setStyle(style)
.setContentTitle("棠梨煎雪")
.setContentText("银临")
.setLargeIcon(BitmapFactory.decodeResource(resources,R.mipmap.album))
.setActions(playAction.build(),nextAction.build(),prevAction.build())
.build() val notificationChannel = NotificationChannel(
channelId,
"音乐播放",
NotificationManager.IMPORTANCE_DEFAULT
)
notificationManager.createNotificationChannel(notificationChannel) notificationManager.notify(0, notification)
}

Android Notification使用的更多相关文章

  1. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  2. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  3. 3、android notification 详细用法

    在 android 系统中,在应用程序可能会遇到几种情况需要通知用户,有的需要用户回应,有的则不需要,例如: * 当保存文件等事件完成,应该会出现一个小的消息,以确认保存成功. * 如果应用程序在后台 ...

  4. android notification 传值关键

    android notification 传值关键在 onNewIntent方法里获取 @Override protected void onCreate(Bundle savedInstanceSt ...

  5. Android NOtification 使用(震动 闪屏 铃声)

    一. Notification 简介 在 android 系统中,在应用程序可能会遇到几种情况需要通知用户,有的需要用户回应,有的则不需要,例如: * 当保存文件等事件完成,应该会出现一个小的消息,以 ...

  6. Android Notification通知详细解释

    Android Notification通知具体解释  Notification: (一).简单介绍:         显示在手机状态栏的通知. Notification所代表的是一种具有全局效果的通 ...

  7. Android Notification实现推送消息过程中接受到消息端有声音及震动及亮屏提示

    在Android Notification状态栏通知一文中,简单实现了消息的推送效果,这里就接着上文说一下,当用户接受到消息时的提示效果 // 5-增加震动及声音及亮屏 notification.de ...

  8. Android Notification通知简介

    Android Notification通知简介 根据activity的生命周期,在activity不显示时,会执行onStop函数(比如按下home键),所以你在onStop函数(按退出键除外)里面 ...

  9. Android Notification状态栏通知

    没有添加额外的震动及声音效果,这里直接实现了通知的功能,看效果吧: MainActivity.java package com.example.notification; import android ...

  10. Android Notification 消息通知 相关资料.md

    目录 Android Notification 消息通知 相关资料 Android 5.0 Lollipop (API 21)无法正常显示通知图标,只能看到一个白色方块或灰色方块的问题 解决方案 参考 ...

随机推荐

  1. python采集A站m3u8视频格式视频

    基本开发环境 (https://jq.qq.com/?_wv=1027&k=NofUEYzs) Python 3.6 Pycharm 相关模块的使用 (https://jq.qq.com/?_ ...

  2. Java开发问题:Column 'AAA' in where clause is ambiguous解决办法

    当在java开发中遇到了Column 'AAA' in where clause is ambiguous问题时, 你需要去看看:多表查询的时候不同的表是否出现了相同名称相同的列, 如果存在,你需要在 ...

  3. halcon简易标定代码

    read_image (Image, 'C:/Users/HJ/Desktop/demo1/4.bmp') threshold(Image, Region, 110, 255) closing_cir ...

  4. PaddleOCR系列(一)--环境搭建

    官方建议使用他们的docker镜像,所以我们按照他们建议的来. 环境搭建其实很简单,其实不需要在宿主机上配置cuda及cudnn,只需要保证宿主机上的cuda大于docker镜像中的就可以了. 所以我 ...

  5. 5-1 Vant | 移动组件库

    Vant 什么是Vant Vant是一个轻量,可靠的移动端组件库,2017开源 目前 Vant 官方提供了 Vue 2 版本.Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付 ...

  6. 03 uniapp自定义导航栏的开发

    在我眼里自定义导航分2类: 原生基础上 || 非原生基础上 总结:项目当中能原生就原生,提高性能 区别 uni-app 自带原生导航栏,在pages.json里配置. 原生导航的体验更好,渲染新页面时 ...

  7. 阻塞赋值-非阻塞赋值(LUT,FDC,BUF...)

    一.看RTL级综合网络 1.1 FDC FDPE FDRE FDSE均是XILINX FPGA片上资源中四种不同的触发器,具体功能可直接百度 1.2 LUT是实现组合逻辑功能的一张真值表,根据输入值直 ...

  8. 发明Linux的帕特里克

    Slackware Linux 是目前市场存活时间最长的 Linux 发行版之一,它基于一个叫做 SLS(Soft Landing Systems)的 Linux 项目而设计,易于使用和稳定. Sla ...

  9. C#基础语法之-泛型

    泛型:一共7个知识点 1.引入泛型,延迟声明 2.如何声明和使用泛型 3.泛型的好处和原理 4.泛型类,泛型方法,泛型接口,泛型委托 5.泛型约束 6.协变,逆变 7.泛型缓存 一.为啥会出现泛型,有 ...

  10. Java开发学习(十八)----AOP通知获取数据(参数、返回值、异常)

    前面的博客我们写AOP仅仅是在原始方法前后追加一些操作,接下来我们要说说AOP中数据相关的内容,我们将从获取参数.获取返回值和获取异常三个方面来研究切入点的相关信息. 前面我们介绍通知类型的时候总共讲 ...