当前位置: 首页 > news >正文

Android14前台服务适配指南

Android14前台服务适配指南

Android 10引入了android:foregroundServiceType属性,用于帮助开发者更有目的地定义前台服务。这个属性在Android 14中被强制要求,必须指定适当的前台服务类型。以下是可选择的前台服务类型:

  1. camera: 相机应用。
  2. connectedDevice: 与连接的设备相关的应用。
  3. dataSync: 数据同步应用。
  4. health: 与健康相关的应用。
  5. location: 位置相关的应用。
  6. mediaPlayback: 媒体播放应用。
  7. mediaProjection: 媒体投影应用。
  8. microphone: 麦克风相关的应用。
  9. phoneCall: 电话呼叫应用。
  10. remoteMessaging: 远程消息应用。
  11. shortService: 短期服务应用。
  12. specialUse: 特殊用途应用。
  13. systemExempted: 系统例外应用。

如果应用的前台服务与上述类型无关,建议迁移到使用WorkManager或用户触发的数据传输作业等其他方式。

值得注意的是,Android 14中新增了healthremoteMessagingshortServicespecialUsesystemExempted类型。应用在清单文件中必须声明前台服务类型,如下所示:

<manifest ...><uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" /><application ...><serviceandroid:name=".MyMediaPlaybackService"android:foregroundServiceType="mediaPlayback"android:exported="false"></service></application>
</manifest>

对于以Android 14为目标平台的应用,如果没有定义前台服务类型,系统将在调用startForeground()时引发MissingForegroundServiceTypeException异常。这一变化旨在提高应用的安全性和用户隐私保护。

Android14前台服务适配

  1. 声明新权限:以Android 14为目标平台的应用使用前台服务类型时,必须根据前台服务类型声明特定的权限。这些权限列在每种前台服务类型的预期用例和强制执行部分中,并被标记为“您必须在清单文件中声明的权限”。这些权限都是一般权限,无法被用户撤销。如果应用调用startForeground()但未声明适当的前台服务类型权限,系统将引发SecurityException异常。

  2. 运行时包含前台服务类型:对于启动前台服务的应用,建议使用startForeground()的重载版本,可以在其中传递一个或多个前台服务类型的值。通常,应该只声明与特定用例相关的前台服务类型。如果某个前台服务以多个类型启动,应该遵守所有类型的强制执行要求。

  3. 系统运行时检查:系统会检查前台服务类型的使用是否合适,并验证应用是否已请求适当的运行时权限或使用所需的API。例如,应用使用FOREGROUND_SERVICE_TYPE_LOCATION前台服务类型时,需要请求ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION权限。应用必须严格遵循请求权限和启动前台服务的特定顺序。在调用startForeground()之前,必须先请求并获得所需的权限。如果应用不满足前台服务的运行时要求,在调用startForeground()后,系统将抛出SecurityException,这可以防止前台服务启动,可能导致应用崩溃。

每种前台服务类型的预期用例和强制执行部分提供了有关平台强制执行要求的详细信息,应用开发者应按照这些规定来使用前台服务类型以确保应用的正常运行。

每种前台服务类型的预期用例和强制执行

仅就摄像头、连接的设备、数据同步等几项服务,说明前台服务用法,更多类型使用请参考下面链接。

https://developer.android.google.cn/about/versions/14/changes/fgs-types-required?hl=zh-cn

要使用特定的前台服务类型,应满足以下条件:

  1. 在清单文件中声明特定权限。

  2. 满足特定的运行时要求。

  3. 应用必须满足该类型的其中一组预期用例。

具体前台服务类型的要求如下:

  • 摄像头:

    • 声明权限:FOREGROUND_SERVICE_CAMERA
    • 运行时要求:请求相机运行时权限。
    • 用例:继续在后台访问相机,如支持多任务的视频聊天应用。
  • 连接的设备:

    • 声明权限:FOREGROUND_SERVICE_CONNECTED_DEVICE
    • 运行时要求:必须满足特定权限或运行时权限。
    • 用例:与需要蓝牙、NFC、IR、USB或网络连接的外部设备进行互动。用例可以包括蓝牙连接、网络连接等。
  • 数据同步:

    • 声明权限:FOREGROUND_SERVICE_DATA_SYNC
    • 运行时要求:无。
    • 用例:数据传输操作,如数据上传、备份、导入导出、文件处理等。这个前台服务类型将被废弃,建议使用WorkManager或用户发起的数据传输作业。
  • 健康(预览版,Android 14新增):

    • 声明权限:FOREGROUND_SERVICE_HEALTH
    • 运行时要求:必须满足特定权限或运行时权限。
    • 用例:为健身类别的应用提供支持的长时间运行用例,如健身追踪器。
  • 位置:

    • 声明权限:FOREGROUND_SERVICE_LOCATION
    • 运行时要求:请求位置信息使用权限,包括ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION
    • 用例:长时间运行的位置信息用例,如导航和位置信息分享。

满足这些前台服务类型的要求是确保应用能够正常使用相关功能的关键。开发者应在清单文件和运行时权限请求中遵循这些规定,以确保应用能够以前台服务类型的方式正常运行。

前台服务用于用户数据传输业务

在 Android 14 中,前台服务规则更严格,要求应用满足条件才能使用前台服务。引入新 API 指定用户发起的数据传输作业,适用于长时间数据传输。这类作业需要用户手动启动,具备 RUN_USER_INITIATED_JOBS 权限。改进旨在提高系统稳定性和用户体验。

开启用户作业

要运行用户发起的作业,请执行以下步骤:

  1. 在清单文件中声明 RUN_USER_INITIATED_JOBS 权限:
<manifest ...><uses-permission android:name="android.permission.RUN_USER_INITIATED_JOBS" /><application ...>...</application>
</manifest>
  1. 在构建 JobInfo 对象时,使用新的 setUserInitiated()setDataTransfer() 方法。建议您提供预估的载荷大小,可以使用 setEstimatedNetworkBytes() 方法:
val networkRequestBuilder = NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)val jobInfo = JobInfo.Builder()// ....setUserInitiated(true).setDataTransfer(true).setRequiredNetwork(networkRequestBuilder.build()).setEstimatedNetworkBytes(1024 * 1024 * 1024)// ....build()
  1. 在应用可见时或满足允许的条件时调度作业:
val jobScheduler: JobScheduler =context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(jobInfo)
  1. 执行作业时,请确保为 JobService 对象调用 setNotification(),用于通知用户作业正在运行:
val notification = Notification.Builder(applicationContext, NOTIFICATION_CHANNEL_ID).setContentTitle("My user-initiated data transfer job").setSmallIcon(android.R.mipmap.myicon).setContentText("Job is running").build()class CustomJobService : JobService() {override fun onStartJob(params: JobParameters?): Boolean {setNotification(params, notification.id, notification, JobService.JOB_END_NOTIFICATION_POLICY_DETACH)// 执行作业任务。}
}
  1. 请注意,如果未及时调用 setNotification(),可能导致应用出现 ANR。

  2. 定期更新通知,以便用户了解作业的状态和进度。如果在安排作业之前无法确定传输大小,请在了解传输大小后使用新的 API updateEstimatedNetworkBytes() 更新传输大小。

  3. 在作业执行完成后,调用 jobFinished() 以向系统表明作业已完成,或者需要重新调度作业。

停止用户作业

  1. 停止用户发起的数据传输作业:

    • 用户和系统都可以停止用户发起的传输作业。
    • 用户可以通过任务管理器中的 Stop 操作来停止用户发起的传输作业。
    • 当用户停止作业时,系统会终止应用的进程,包括所有正在运行的作业或前台服务。
    • 系统不会调用 onStopJob() 来终止作业,也会阻止重新调度用户可见的作业。
    • 建议在发布的作业通知中提供控件,以方便用户停止和重新调度作业。
    • 在某些情况下,任务管理器中可能不会显示 Stop 按钮或作业根本不会出现。
  2. 系统提供的停止作业:

    • 与常规作业不同,用户发起的数据传输作业不受应用待机模式存储分区配额的影响。
    • 但是,系统仍会停止作业,原因包括:
      • 不再满足开发者定义的约束条件。
      • 系统认为该作业的运行时间超出了完成数据传输所需的时间。
      • 系统需要优先考虑系统运行状况,可能由于设备温度过高而停止作业。
      • 应用进程因设备内存不足而被终止。
    • 当系统停止作业时(不是因内存不足),系统会调用 onStopJob(),并在系统认为最佳的时间重试作业。
    • 开发者应确保应用能够保留数据传输状态,即使未调用 onStopJob(),并在再次调用 onStartJob() 时能够恢复状态。

用户作业约束条件

总结如下:

  1. 为了支持在最佳时间点运行的作业,Android 提供了能够为每种作业类型分配约束条件的功能,这一功能从 Android 13 开始可用。

  2. 用户发起的数据传输作业允许使用的约束条件包括:

    • setBackoffCriteria(JobInfo.BACKOFF_POLICY_EXPONENTIAL)
    • setClipData()
    • setEstimatedNetworkBytes()
    • setMinimumNetworkChunkBytes()
    • setPersisted()
    • setNamespace()
    • setRequiredNetwork()
    • setRequiredNetworkType()
    • setRequiresBatteryNotLow()
    • setRequiresCharging()
    • setRequiresStorageNotLow()

测试

测试应用作业的步骤包括:

  • 获取作业 ID。
  • 通过命令 adb shell cmd jobscheduler run -f APP_PACKAGE_NAME JOB_ID 可以立即运行或重试已停止的作业。
  • 通过命令 adb shell cmd jobscheduler timeout TEST_APP_PACKAGE TEST_JOB_ID 可以模拟系统强行停止作业,例如因系统运行状况或超出配额条件。

相关文章:

Android14前台服务适配指南

Android14前台服务适配指南 Android 10引入了android:foregroundServiceType属性&#xff0c;用于帮助开发者更有目的地定义前台服务。这个属性在Android 14中被强制要求&#xff0c;必须指定适当的前台服务类型。以下是可选择的前台服务类型&#xff1a; camera: 相机应用。…...

Spring Boot中使用Spring Data JPA访问MySQL

Spring Data JPA是Spring框架提供的用于简化JPA&#xff08;Java Persistence API&#xff09;开发的数据访问层框架。它通过提供一组便捷的API和工具&#xff0c;简化了对JPA数据访问的操作&#xff0c;同时也提供了一些额外的功能&#xff0c;比如动态查询、分页、排序等。 …...

Go 语言函数闭包(匿名函数)

Go 语言函数闭包&#xff08;匿名函数&#xff09; 在Go语言中&#xff0c;闭包是一种特殊的匿名函数&#xff0c;它可以捕获并访问其周围的变量。闭包允许将函数与其引用的环境捆绑在一起&#xff0c;使得函数可以在其创建的范围之外继续使用这些变量。以下是关于Go语言闭包的…...

2023年11月编程语言流行度排名

点击查看最新编程语言流行度排名&#xff08;每月更新&#xff09; 2023年11月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自…...

apache-maven-3.6.3 安装配置教程

链接&#xff1a;https://pan.baidu.com/s/1RkMXipnvac9EKcZyUStfGQ?pwdl32m 提取码&#xff1a;l32m 1. 将 maven 压缩包解压至指定文件夹 2. 配置环境变量 &#xff08;1&#xff09;打开此电脑-> 鼠标右键选择属性->点击高级系统设置 &#xff08;2&#xff09;点…...

你一般什么时候使用GPT

一般在寻求帮助的时候才使用gpt 一个优秀的gpt项目gpt-on-web...

kubernetes (k8s)的使用

一、kubernetes 简介 谷歌2014年开源的管理工具项目&#xff0c;简化微服务的开发和部署。 提供功能&#xff1a;自愈和自动伸缩、调度和发布、调用链监控、配置管理、Metrics监控、日志监控、弹性和容错、API管理、服务安全等。官网&#xff1a;https://kubernetes.io/zh-cn…...

RK3568平台开发系列讲解(音视频篇)RTMP 推流

🚀返回专栏总目录 文章目录 一、RTMP 的工作原理二、RTMP 流媒体服务框架2.1、Nginx 流媒体服务器2.2、FFmpeg 推流沉淀、分享、成长,让自己和他人都能有所收获!😄 📢目前常见的视频监控和视频直播都是使用了 RTMP、RTSP、HLS、MPEG-DASH、 WebRTC流媒体传输协议等。 R…...

掌握这几个技巧,才敢称为Jenkins大神!

01、Performance插件兼容性问题 自由风格项目中&#xff0c;有使用 Performance 插件收集构建产物&#xff0c;但是截至到目前最新版本&#xff08;Jenkins v2.298&#xff0c;Performance&#xff1a;v3.19&#xff09;&#xff0c;此插件和Jenkins都存在有兼容性问题&#xf…...

帷幄内容管理系统:从立人设、做内容到定向投流,品牌 KOS 体系打造「百万导购」

随着公域流量越来越贵&#xff0c;获客成本越来越高&#xff0c;品牌们已经越来越不满足于高曝光&#xff0c;而是更多地关注起销售转化率。继 KOL、KOC&#xff08;关键意见消费者&#xff09; 之后&#xff0c;KOS&#xff08;关键意见销售&#xff09;营销模式走入品牌的视野…...

5.vue3项目(五):实现顶部导航栏功能:导航栏静态搭建,菜单折叠功能实现,面包屑动态展示路径,刷新页面功能,全屏功能

目录 一、左侧菜单栏刷新,不要合并菜单 二、顶部tabbar静态搭建 1.新建文件 2.编辑页面 3.结果测试...

unittest 统计测试执行case总数,成功数量,失败数量,输出至文件,生成一个简易的html报告带饼图

这是一个Python的单元测试框架的示例代码&#xff0c;主要用于执行测试用例并生成测试报告。其中&#xff0c;通过unittest模块创建主测试类MainTestCase&#xff0c;并加载其他文件中的测试用例&#xff0c;统计用例的执行结果并将结果写入文件&#xff0c;最后生成一个简单的…...

推荐一款功能强大的在线文件预览工具-kkFileView

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…...

【Linux】磁盘阵列,了解不同raid的特点

一、raid和阵列卡介绍 1、什么是磁盘阵列&#xff1a; 磁盘阵列是利用虚拟化存储技术把很多块独立的磁盘组合成一个容量巨大的磁盘组&#xff0c;利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术&#xff0c;将数据切割成许多区段&#xff0c;分别存放…...

Go 语言初探:从基础到实战

1.Go概述 程序是一段计算机指令的有序组合。程序算法数据结构。任何程序都可以将模块通过三种基本的控制结构&#xff08;顺序、分支、循环&#xff09;进行组合来实现。 Go&#xff08;也称为Golang&#xff09;是一种由Google开发的开源编程语言。设计目标是使编程更简单、…...

Kotlin文件和类为什么不是一对一关系

在Java中&#xff0c;一个类文件的public类名必须和文件名一致&#xff0c;如何不一致就会报异常&#xff0c;但是在kotlin的文件可以和类名一致&#xff0c;也可以不一致。这种特性&#xff0c;就跟c有点像&#xff0c;毕竟c的.h 和 .cpp文件是分开的。只要最终编译的时候对的…...

Kubernetes实战(四)-部署docker harbor私有仓库

1 Docker原生私有仓库Registry 1.1 原生私有仓库Registry概述 Docker的仓库主要分两类&#xff1a; 私有仓库公有仓库 共有仓库只要在官方注册用户&#xff0c;登录即可使用。但对于仓库的使用&#xff0c;企业还是会有自己的专属镜像&#xff0c;所以私有库的搭建也是很有…...

IDEA JAVA项目 导入JAR包,打JAR包 和 JAVA运行JAR命令提示没有主清单属性

一、导入JAR包 1、java项目在没有导入该jar包之前&#xff0c;如图&#xff1a;2、点击 File -> Project Structure&#xff08;快捷键 Ctrl Alt Shift s&#xff09;&#xff0c;点击Project Structure界面左侧的“Modules”如图&#xff1a;3.在 “Dependencies” 标签…...

c#输入和输出

第一个c#程序 /* c#在编译时首先编译为通用中间语言&#xff08;IL代码&#xff09;&#xff0c;并且将其存在程序集中 c#的程序集包括扩展名为.exe的可执行文件和扩展名为.dll的可供其他程序调用的库文件c#在执行时首先将程序集加载到CLR中&#xff0c;然后通过即时编译器编译…...

设置区块链节点输出等级为警告级,并把日志存储阈值位100MB并验证;

题目 获取指定区块链节点输出等级为警告级&#xff0c;并设置日志存储阈值位100MB并验证&#xff1b; 操作步骤 1.切换目录 cd nodes/127.0.0.1/node0 2.打开配置文件并修改 vim config.ini warn&#xff1a;警告...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...