一 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. SQL Server各版本序列号/激活码/License/秘钥

    SQL Server 2019 Enterprise:HMWJ3-KY3J2-NMVD7-KG4JR-X2G8G Enterprise Core:2C9JR-K3RNG-QD4M4-JQ2HR-846 ...

  2. BUUCTF-一叶障目

    一叶障目 010editor打开没发现有什么异常,看分辨率尺寸觉得不对劲,修改了一下发现了flag 图片第二组前面四个是宽后面是高,修改第七位为05即可发现flag flag{66666}

  3. MySQL-2-DQL

    DQL:数据查询语言 SQLyog中格式化某段语句片段:CTRL+F12 基础查询 语法: select 查询列表 from 表名: 特点: ① 查询列表可以是:表中的字段.常量值.表达式.函数 ② ...

  4. ABAP CDS DDHEADANNO

  5. 使用.NetCore自带的后台作业,出入队简单模拟生产者消费者处理请求响应的数据

    环境:Core:3.1的项目 说明:由于该方案为个人测试项目,重启时队列中的部分数据很可能会丢失, 对数据有要求的该方案不适用,不能照搬需要持久化处理, 另外发布到Linux Docker中通常不会自 ...

  6. cookie、session、tooken

    一.cookie 的诞生 首先需要知道Http协议的无状态连接的,即这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的. 服务端,既不知道上一次请求和这一次请求的关联,也无法知道哪一个客户 ...

  7. 活动报名 | 如何基于开源项目 Tapdata PDK,快速完成数据源和目标的开发?

      近日,Tapdata 启动 PDK 插件生态共建计划,宣布开源插件开发框架 Tapdata PDK,将自身的数据接口能力开放出来,帮助开发者根据实际需求,自助接入数据源和目标,快速开启「Data ...

  8. 挑战30天写操作系统-day1-从计算机结构到汇编程序入门

    先动手操作 软盘映像文件制作:先采用二进制编辑器编辑我们所需要的映像文件helloos.img 二进制编辑器下载链接:Bz - c.mos (vcraft.jp) 制作好之后,可以选择写入软盘,通过软 ...

  9. Kafka入门实战教程(7):Kafka Streams

    1 关于流处理 流处理平台(Streaming Systems)是处理无限数据集(Unbounded Dataset)的数据处理引擎,而流处理是与批处理(Batch Processing)相对应的.所 ...

  10. 74HC595驱动(并转串,fpga与时钟匹配,fpga与外部芯片的连接注意事项)

    上一次设计的动态扫描数码管显示电路模型如上,这是一个32位并行数据[31:0]disp_num选通输出并行数据[7:0]select和[7:0]段选的电路.因此需要输出16个信号 而在开发板上的电路与 ...