Android Notification使用
一 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使用的更多相关文章
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- 3、android notification 详细用法
在 android 系统中,在应用程序可能会遇到几种情况需要通知用户,有的需要用户回应,有的则不需要,例如: * 当保存文件等事件完成,应该会出现一个小的消息,以确认保存成功. * 如果应用程序在后台 ...
- android notification 传值关键
android notification 传值关键在 onNewIntent方法里获取 @Override protected void onCreate(Bundle savedInstanceSt ...
- Android NOtification 使用(震动 闪屏 铃声)
一. Notification 简介 在 android 系统中,在应用程序可能会遇到几种情况需要通知用户,有的需要用户回应,有的则不需要,例如: * 当保存文件等事件完成,应该会出现一个小的消息,以 ...
- Android Notification通知详细解释
Android Notification通知具体解释 Notification: (一).简单介绍: 显示在手机状态栏的通知. Notification所代表的是一种具有全局效果的通 ...
- Android Notification实现推送消息过程中接受到消息端有声音及震动及亮屏提示
在Android Notification状态栏通知一文中,简单实现了消息的推送效果,这里就接着上文说一下,当用户接受到消息时的提示效果 // 5-增加震动及声音及亮屏 notification.de ...
- Android Notification通知简介
Android Notification通知简介 根据activity的生命周期,在activity不显示时,会执行onStop函数(比如按下home键),所以你在onStop函数(按退出键除外)里面 ...
- Android Notification状态栏通知
没有添加额外的震动及声音效果,这里直接实现了通知的功能,看效果吧: MainActivity.java package com.example.notification; import android ...
- Android Notification 消息通知 相关资料.md
目录 Android Notification 消息通知 相关资料 Android 5.0 Lollipop (API 21)无法正常显示通知图标,只能看到一个白色方块或灰色方块的问题 解决方案 参考 ...
随机推荐
- Django从数据库导model迁移乱码
python manage.py inspectdb > [your app name]\models.py 执行后 model.py乱码,将models.py以 UTF-16LE打开.
- BUUCTF-BJDCTF2020]just_a_rar
BJDCTF2020]just_a_rar 压缩包提示是四位数密码 爆破得知压缩包密码 16进制查看解压的图片后发现flag flag{Wadf_123}
- oracle-安装与访问、卸载
安装oracle 官网(http://oracle.com/ )下载oracle -->Oracle Database -->点击接受Accept --> 下载11g(Downloa ...
- 面向对象的封装(粘贴Markdown代码解决缩进问题)
直接粘贴idea的代码会导致缩进错乱,建议先粘贴到记事本再粘贴到笔记!!! 1.先将属性私有化,再对外提供简单的接口可以访问内部.如set.get方法 2.set方法:修改年龄 public void ...
- easyexcel注解
1.@ExcelProperty 必要的一个注解,注解中有三个参数value,index分别代表列明,列序号 1.value 通过标题文本对应2.index 通过文本行号对应 2.@ColumnWit ...
- GaussDB(for MySQL) :Partial Result Cache,通过缓存中间结果对算子进行加速
摘要:华为云数据库高级内核技术专家详解GaussDB(for MySQL)Partial Result Cache特性,如何通过缓存中间结果对算子进行加速? 本文分享自华为云社区<GaussDB ...
- Solution -「最大权闭合子图」做题随笔
T1 小 M 的作物 先从简化题目入手,考虑先去掉 \(c\) 的额外收益.然后尝试将所有作物种在 \(B\), 则目前得到了 \(\sum \limits_{i = 1} ^n b_i\) 的收益. ...
- 音响音箱/恒温壶/电量显示/电子数字时钟等LED数码管显示驱动IC-VK1640B 8段12位/12段8位显示
市面上最常用的数码管为七段/八段显示,八段数码管比七段数码管多一个发光二极管单元(比七段数码管多一个点),又按能显示多少个"8"可分为1位.2位.4位等等.数码管又分为共阳极驱动/ ...
- Java开发学习(十七)----AOP案例之测量业务层接口执行效率
一.需求分析 这个需求比较简单 需求:任意业务层接口执行均可显示其执行效率(执行时长) 这个的目的是查看每个业务层执行的时间,这样就可以监控出哪个业务比较耗时,将其查找出来方便优化. 具体实现的思路: ...
- python 线程理解
简介 一个应用程序由多个进程组成,一个进程有多个线程,一个线程则是操作系统调度的最小单位,当应用程序运行时,操作系统根据优先级和时间片调度线程(决定此时此刻执行哪个线程). python的线程 pyt ...