速学Android 16新功能:带有进度的通知类型

前言

在当前已公布的Android 16版本中新增了一系列的功能特性和API,如:

  • 动态壁纸的内容处理,提供新的 content API
  • 预测性返回更新,添加了finishAndRemoveTaskCallback()moveTaskToBackCallback等API
  • 健康数据共享更新,添加了ACTIVITY_INTENSITY新数据类型
  • 在 ApplicationStartInfo 中启动组件,添加了 getStartComponent(),用于区分触发启动的组件类型
  • 引入了以进度为中心的Notification.ProgressStyle类型通知,帮助用户顺畅地跟踪用户发起的端到端历程
  • ...

本次我们主要来看Notification.ProgressStyle这种新类型的通知。

什么是有进度的通知?

先来看一张官方的图片。

此时你可能冷嘲热讽:这不就是下载进度的样式吗?不早就有了吗?使用builder.setProgress两秒钟搞定。

不,builder.setProgress 只能设置一个数值,而Notification.ProgressStyle是通知中心新增的全新类型,功能也更加丰富。

我们可以用在共享车辆、导航、快递距离以及 任务完成度等场景中,而之前如果想实现这种功能就只能通过自定义通知的View来解决。

通知模板

Notification.ProgressStyle通知类型模板如下图所示:

各参数含义如下图所示:

参数 定义
A 背景图标。一般为App图标
B 头部标题,一般为App名称
C 通知时间,一般为系统生成
D 通知标题
E 通知内容
F 进度条
G 操作按钮

我们还可以给进度条设置一个图标,如导航按钮或者小汽车图标,如下图所示:

代码实践

比如,我们现在创建一个带有进度的通知样式,代码如下所示:

less 复制代码
var progressStyle = if (Build.VERSION.SDK_INT >= 36) {
    Notification.ProgressStyle().setStyledByProgress(false).setProgress(456)
        .setProgressTrackerIcon(Icon.createWithResource(context, R.mipmap.care))
        .setProgressSegments(
            listOf(
                Notification.ProgressStyle.Segment(41).setColor(Color.BLACK),
                Notification.ProgressStyle.Segment(552).setColor(Color.YELLOW),
                Notification.ProgressStyle.Segment(253).setColor(Color.WHITE),
                Notification.ProgressStyle.Segment(94).setColor(Color.BLUE)
            )
        ).setProgressPoints(
            listOf(
                Notification.ProgressStyle.Point(60).setColor(Color.RED),
                Notification.ProgressStyle.Point(560).setColor(Color.GREEN)
            )
        )

然后,我们使用这个progressStyle构建一个通知并发送。

scss 复制代码
progressStyle?.let {
val builder: Notification.Builder =
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Notification.Builder(context, "chat1")
                .setSmallIcon(android.R.drawable.ic_dialog_info)
                .setContentTitle("阿黄哥送外卖")
                .setContentText("您的外卖正在配送中")
                .setPriority(Notification.PRIORITY_DEFAULT)
        } else {
            TODO("VERSION.SDK_INT < O")
        }
    it.setBuilder(builder)
    notificationManager?.notify(3, it.build());
} 

运行程序,效果如下图所示。

setProgressPoints用于构建线路中的点,如蓝色和红色的方块,setProgressSegments用于构建线路中的路线。

setProgress用于设置当前位置,当前位置会计算在点和路线的总距离内。如我们仅设置线路路线长度为500,当前位置为250,则图标会在中间位置。

代码如下所示:

less 复制代码
Notification.ProgressStyle().setStyledByProgress(false) .setProgress( 250 )
    .setProgressTrackerIcon(Icon.createWithResource(context, R.mipmap.care))
    .setProgressSegments(
        listOf(
            Notification.ProgressStyle.Segment( 250 ).setColor(Color. GREEN ),
Notification.ProgressStyle.Segment( 250 ).setColor(Color. DKGRAY )
        )
    )

运行程序如下图所示:

最后

有了这个功能,我们可以将导航以及自身的位置实时显示在通知栏中,并且可以通过设置不同的颜色来标记路程的拥堵情况。相信后续地图、外卖软件等会优先使用这个新功能。

而对Android开发者来说,这一重大更新让我们距离送外卖又近了一步!

相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui