Android14前台服务适配指南

news2024/12/27 12:21:28

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 ...>
    <service
        android: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 可以模拟系统强行停止作业,例如因系统运行状况或超出配额条件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1184979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

antd-vue + vue3 实现a-table动态增减行,通过a-from实现a-table行内输入验证

一、效果图 图一&#xff1a;校验效果 二、主要代码 注意&#xff1a; 1、form 与 table 绑定的是同一个数据 tableSource 并且是一个数据&#xff08;ElementUI 需要 对象包数组&#xff09; 2、form用的是 name 绑定 -> :name"[index, vlan_id]" 3、form-i…

MES管理系统中常规的生产建模有哪些

随着制造业的快速发展&#xff0c;MES生产管理系统已经成为了现代制造业不可或缺的核心系统。MES通过对生产过程进行建模&#xff0c;实现了生产过程的可视化、可控制和可优化&#xff0c;为企业提供了全方位的生产管理解决方案。本文将深化对MES管理系统及其主要生产模型的理解…

React构建组件的方式有哪些?区别?

一、是什么 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念&#xff08;组件&#xff09;来实现开发的模式 在React中&#xff0c;一个类、一个函数都可以视为一个组件 在之前文章中&#xff0c;我们了解到组件所存在的优势&#xff1a; 降低整个系统的耦合度&am…

大功率继电器 UEG/F-4DPDT EDP01-RDI/1抗干扰型 轨道继电器 josef约瑟

UEG/F系列抗干扰型中间继电器电力系统和工业自动化的装置中,明确而可靠的信号护展和电隔离技术变得日益重要.UEG/F系列抗干扰继电器应用在电力系统及工业控制领域中,用于外界干扰较大的接点信号的重动、采集。 系列型号 UEG/F-2H2D抗干扰中间继电器;UEG/F-1H1D抗干扰中间继电器…

中国电子学会2023年09月份青少年软件编程Scratch图形化等级考试试卷四级真题(含答案)

2023-09 Scratch四级真题 分数&#xff1a;100 题数&#xff1a;24 测试时长&#xff1a;60min 一、单选题(共10题&#xff0c;共30分) 1.角色为一个紫色圆圈&#xff0c;运行程序后&#xff0c;舞台上的图案是&#xff1f;&#xff08;A &#xff09;(3分) A. B. C. …

【云栖2023】林伟:大数据AI一体化的解读

本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;林伟 | 阿里云研究员&#xff0c;阿里云计算平台事业部首席架构师&#xff0c;阿里云人工智能平台PAI和大数据开发治理平台DataWorks负责人 演讲主题&#xff1a;大数据AI一体化…

dart中字符串的常用操作方法函数,和python有点像

在开发语言中&#xff0c;字符串操作可谓是非常的多&#xff0c;所以需要记住很多字符串这类的相关函数和方法&#xff0c;至少最常用的几种是要记住的&#xff1a;切分&#xff0c;包含&#xff0c;查找&#xff0c;是否以XX开头等等 void run() {var str1 "你好&#…

moc_ XX.cpp 中的函数没有定义

解决办法&#xff1a; 直接将 moc_OnlyTest.cpp 文件&#xff0c;添加到工程目录下&#xff0c;解决。

使用swagger-typescript-api

引言 前后端分离大致是这样的 后端&#xff1a;控制层 / 业务层 / 数据操作层前端&#xff1a;控制层 / 视图层 前后端的控制层&#xff0c;实际上就是前后端接口的对接 前后端分离&#xff0c;实现了更好地解耦合&#xff0c;但也引入了接口对接的过程&#xff0c;这个过程…

什么是外贸SOHO建站?新手如何做好推广?

新手外贸SOHO建站教程&#xff1f;海洋建站谷歌SEO优化步骤&#xff1f; 外贸SOHO建站是一种为小型外贸企业和个体经营者提供的网站建设服务&#xff0c;旨在帮助他们在国际市场上建立自己的在线存在&#xff0c;从而拓展业务。海洋建站将深入探讨外贸SOHO建站的含义&#xff…

vue下使用Echarts5绘制基础图表

项目使用Vue3加Echarts5绘制的基本图表&#xff0c;图表自适应浏览器窗口大小 先上图&#xff0c;大屏小屏都可完美展示&#xff0c;纯属练手 一 先上图 1.任意缩放窗口的大小 2.平板 3.电脑 4.饼图 5.折线图 二 后上代码 <script lang"ts"> import {d…

Jwt,Token,Cookie,Session之间的区别

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

ROS学习笔记(6):ros_control

1.ros_control简介 ros_control - ROS Wiki ros_control是为ROS提供的机器人控制包&#xff0c;包含一系列控制器接口、传动装置接口、控制器工具箱等,有效帮助机器人应用功能包快速落地&#xff0c;提高开发效率。 2.ros_control框架 ros_control总体框架&#xff1a; 针对…

【springboot配置项动态刷新】与【yaml文件转换为java对象】

文章目录 一&#xff0c;序言二&#xff0c;准备工作1. pom.xml引入组件2. 配置文件示例 三&#xff0c;自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四&#xff0c;yaml文件转换为java对象1. 无法使…

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

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

配置802.1x本地认证,以识别用户身份的示例

组网图形 图1 802.1x本地认证组网图 规格组网需求操作步骤配置注意事项 规格 适用于所有版本、所有形态的AR路由器。 组网需求 PC1(10.10.10.2/30)直接连接到RouterA的Eth2/0/1端口&#xff0c;RouterA的VLANIF10接口IP地址10.10.10.1/30&#xff08;为PC1上的网关IP地址&a…

基于CLIP的图像分类、语义分割和目标检测

OpenAI CLIP模型是一个创造性的突破&#xff1b; 它以与文本相同的方式处理图像。 令人惊讶的是&#xff0c;如果进行大规模训练&#xff0c;效果非常好。 在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D…

一维码和二维码图像优化——提高读码率

1.算子 1.1 decompose3 &#xff08;彩色图像分割算子&#xff09; 算子&#xff1a;decompose3 ——将三通道图像转换为三个图像函数原型&#xff1a;decompose3(MultiChannelImage : Image1, Image2, Image3 : : ) 功能&#xff1a;将3通道图像转换为具有相同定义域&#…

智慧安防:监控防盗两不误的安防视频监控系统是什么样的?

随着社会的不断发展&#xff0c;安全问题越来越受到人们的关注&#xff0c;特别是对于居住在城市里的人们来说&#xff0c;盗窃问题是影响他们生活质量的重要因素之一。因此&#xff0c;根据市场需求&#xff0c;以监控防盗两不误的智慧监控系统得到了广泛的推广和应用。 一般…

不充不行(同时跑三辆车)

欢迎来到程序小院 不充不行 玩法&#xff1a;点击鼠标左键长按充电桩&#xff0c;别让车落回底线&#xff0c;三辆车同时在跑&#xff0c;要控制三个充电桩的电量&#xff0c;电量为0即为游戏结束&#xff0c;看看你能坚持多少秒哦^^。开始游戏https://www.ormcc.com/play/gam…