Android 14适配

Google I/O 2023 发布的 Android beta2 ,Android 14 将在2023年第三季度发布。Google Play 已经开始强制要求targetSdkVersion 33适配,所以 targetSdkVersion 34适配也是非常有必要的。

前台服务类型(Foreground service types are required)

前台服务类型(foregroundServiceType)是在 Android 10 引入的,通过 android:foregroundServiceType 可以指定 <service> 的服务类型,targetSdkVersion 34 的情况下,必须为应用内的每个前台服务(foreground-services) 指定至少一种前台服务类型。此列表显示可供选择的前台服务类型:

  • camera
  • connectedDevice
  • dataSync
  • health
  • location
  • mediaPlayback
  • mediaProjection
  • microphone
  • phoneCall
  • remoteMessaging
  • shortService
  • specialUse
  • systemExempted

如果你 App 中的用例与这些类型中的任何一种都不相关,那么建议还是将服务迁移成 WorkManager 或 jobs 。WorkManager or user-initiated data transfer jobs.

health、remoteMessaging、shortService、specialUse 和 systemExempted 类型是 Android 14 中的新类型。

<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。

声明使用前台服务类型的新权限

如果以 Android 14 为目标平台的应用使用前台服务,则它们必须根据 Android 14 引入的前台服务类型声明特定权限。 

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

所有权限都定义为普通权限,并默认授予。 用户无法撤销这些权限。

注意:如果调用 startForeground() 时未声明适当的前台服务类型权限,系统将抛出 SecurityException。

在运行时包括前台服务类型

启动前台服务的应用程序的最佳做法是使用 startForeground()。在其中传入前台服务类型的按位整数,可以选择传递一个或多个类型值。

如果启动使用以下任何类型的前台服务,则每次为该服务调用 startForeground() 时都应始终包含这些类型:

  • FOREGROUND_SERVICE_TYPE_CAMERA
  • FOREGROUND_SERVICE_TYPE_LOCATION
  • FOREGROUND_SERVICE_TYPE_MICROPHONE
Service.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)

对implicit(隐式)和pending(未决) intents(意图)的限制

对于面向 Android 14 的应用,Android 通过以下方式限制应用向内部应用组件发送隐式意图:

  • 隐式 intent 仅传递给导出的组件,应用必须使用明确的 intent 来交付给未导出的组件,或者将组件标记为已导出(exported) 。
  • 如果应用创建一个 mutable pending intent ,但 intent 未指定组件或包,系统现在会抛出异常。

这些更改可防止恶意应用拦截只供给用内部组件使用的隐式 intent,例如:

<activityandroid:name=".AppActivity"android:exported="false"><intent-filter><action android:name="com.example.action.APP_ACTION" /><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>

如果您的应用尝试使用隐式意图启动此活动,则会抛出异常:

// Throws an exception when targeting Android 14.
context.startActivity(Intent("com.example.action.APP_ACTION"))

要启动未导出的 Activity,您的应用应改用显式 Intent:

// This makes the intent explicit.
val explicitIntent =Intent("com.example.action.APP_ACTION")
explicitIntent.apply {package = context.packageName
}
context.startActivity(explicitIntent)

运行时注册的广播接收器必须指定导出行为

以 Android 14 为目标并使用 context-registered receivers (ContextCompat.registerReceiver)的用和服务的需要指定一个标志,以指示接收器是否应导出到设备上的所有其他应用:分别为 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED。通过利用 Android 13 中引入的这些接收器的功能,此要求有助于保护应用免受安全漏洞的影响。

  1. 启用 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改。
  2. 在应用的每个广播接收器中,明确指明其他应用是否可以向其发送广播,如以下代码段所示:

// This broadcast receiver should be able to receive broadcasts from other apps.
// This option causes the same behavior as setting the broadcast receiver's
// "exported" attribute to true in your app's manifest.
context.registerReceiver(sharedBroadcastReceiver, intentFilter,RECEIVER_EXPORTED)// For app safety reasons, this private broadcast receiver should **NOT**
// be able to receive broadcasts from other apps.
context.registerReceiver(privateBroadcastReceiver, intentFilter,RECEIVER_NOT_EXPORTED)

仅接收系统广播的接收器例外

如果您的应用仅通过 Context#registerReceiver 方法(例如 Context#registerReceiver())为系统广播注册接收器,则在注册接收器时不应指定标志。

从后台启动Activity的限制

针对 Android 14 的应用,系统限制了应用在后台启动 Activity :

  • 当应用使用 PendingIntent#send()发送  PendingIntent 以及类似行为时,如果应用想要授予其自己的后台 service 启动权限以启动 pending intent,则该应用现在必须选择加入一个 ActivityOptions ,具体为带有 setPendingIntentBackgroundActivityStartMode(MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
  • 当一个可见应用使用 bindService() 绑定另一个在后台运行的应用的服务时,如果该可见应用想要将其自己的后台 activity 启动权限授予绑定服务,则它现在必须选择加入 BIND_ALLOW_ACTIVITY_STARTS 标志。

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

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

相关文章

PyTorch: 池化-线性-激活函数层

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 nn网络层-池化-线性-激活函数层池化层最大池化&#xff1a;nn.MaxPool2d()nn.AvgPool2d()nn.MaxUnpool2d()线性层激…

HTML案例:全屏切换滚动效果

一个父级div包裹4个子级div&#xff0c;4个子盒子的宽高占满当前屏幕&#xff0c;滚动导航条自动切换到下一页/上一页 1、HTML代码 <style>* {margin: 0;padding: 0;}.container {height: 100vh;overflow-y: scroll;}.container div {width: 100%;height: 100vh;}</s…

Java设计模式之结构型-桥接模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 1、支付方式 2、支付渠道 五、总结 一、基础概念 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;其主要目的是“将抽象部分与实现部分分离&#xff0c;使它们都可以独立地…

[解决Github 克隆错误] unable to access ‘xxx‘: Recv failure: Connect

1.错误描述&#xff1a; 从GitHub上克隆仓库到本地&#xff0c;出现错误&#xff1a; unable to access https://github.com/xxxx: Recv failure: Connection was reset。 克隆失败。 2.第一次解决此问题&#xff1a;从终端输入&#xff1a; git config --global http.sslVer…

安装TensorFlow时报错 zsh: illegal hardware instruction python

解决方案参考 https://stackoverfLow.com/questions/65383338/zsh-illegal-hardware-instruction-python-when-installing-tensorflow-on-macbook 以下为详细步骤 安装python3.8.5环境 下载tensorflow-2.4.1-py3-none-any.whl文件 下载地址&#xff1a;https://drive.google…

GOPATH、GOROOT(VSCode编写第一个go程序)

1. GOROOT和GOPATH GOROOT 和 GOPATH 都是 Go 语言中的环境变量&#xff0c;用于指定 Go 工具链和工作区的路径。 GOROOT 指定了 Go 工具链的安装路径&#xff0c;它包含了 Go 语言的标准库、编译器等工具。在使用 Go 编译器、运行时等工具时&#xff0c;它们会默认从 GOROOT…

LabVIEW开发图像采集和图像处理程序

LabVIEW开发图像采集和图像处理程序 扫描电子显微镜&#xff08;SEM&#xff09;是一种功能强大的工具&#xff0c;广泛用于高分辨率的生物和半导体样品检测。然而&#xff0c;对于大面积或3D成像&#xff0c;SEM成像是一个耗时的过程。MBSEM旨在通过同时扫描多个像素来减少采…

Android 中的动画有哪几类,它们的特点和区别是什么

Android 中的动画有哪几类&#xff0c;它们的特点和区别是什么 在Android中&#xff0c;常见的动画类型可以分为以下几类&#xff1a; View 动画&#xff08;View Animation&#xff09;&#xff1a; 特点&#xff1a;View动画是一种基于View对象的动画&#xff0c;通过对Vi…

Vue3使用element-plus实现弹窗效果-demo

使用 <ShareDialog v-model"isShow" onChangeDialog"onChangeDialog" /> import ShareDialog from ./ShareDialog.vue; const isShow ref(false); const onShowDialog (show) > {isShow.value show; }; const onChangeDialog (val) > {co…

关于 Eclipse 的一场 “三角关系”

上个世纪 90 年代&#xff0c;世界上的计算机要么不联网&#xff0c;要么在企业内部联网。但是&#xff0c;在互联网的概念下&#xff0c;计算机之间共享信息和资源的需求成为了必要。 1995 年 5 月&#xff0c;Java 横空出世。Java 的父亲是当时凭借 Solaris 操作系统风头正盛…

springboot集成quartz(集群)实现任务定时/立即执行

添加pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</a…

vue3笔记-基础篇

vue3笔记 第一章 基础篇 MVVM框架 vue数据绑定方法 Object.defineProperty() vue2使用的数据绑定方法 var obj {} Object.defineProperty(obj,"myname",{get(){consloe.log("get")}set(value){console.log("set",value)} }proxy代理 vue…

【C#】五种单例模式详解

单例模式有五种&#xff1a; 饿汉模式、懒汉模式、双重锁懒汉模式、静态内部类模式、枚举模式。 1.饿汉式 public class SingleTon1 { private static SingleTon1 instance new SingleTon1(); private SingleTon1() { }public SingleTon1 getInstance(){return instance; …

Golang 中的数组Array以及Slice底层实现

1、Array(数组) 数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素 (element),这种类型可以是任意的原始类型,比如 int 、 string 等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。 在 Golang 中数组是一个长度固定的数据类…

【朱颜不曾改,芳菲万户香。AIGC人物图片创作---InsCode Stable Diffusion 美图活动一期】

【朱颜不曾改&#xff0c;芳菲万户香。AIGC人物图片创作 ---InsCode Stable Diffusion 美图活动一期】 本文目录&#xff1a; 一、 Stable Diffusion 模型在线使用 1.1、模板运行环境配置 1.2、运行InsCode平台的Stable Diffusion模板 二、Stable Diffusion主界面功能 2.…

数据结构——各种常见算法的实现方法和思路

文章目录 常见的排序算法类型复杂度和稳定性 1.冒泡排序2.直接插入排序3.希尔排序4.简单选择排序方法1&#xff1a;双向遍历选择排序方法2&#xff1a;单向遍历选择排序 5.归并排序方法1&#xff1a;递归方法2&#xff1a;非递归 6.快速排序方法1&#xff1a;随机取keyi方法2&a…

MAC下将jar包安装到本地maven仓库

在终端执行命令如下&#xff1a; mvn install:install-file "-Dfile/Users/kkeer/lost_lib/slf4j-1.7.2.jar" "-DgroupIdorg.slf4j" "-DartifactIdslf4j-log4j12" "-Dversion1.7.2" "-Dpackagingjar" "-DgeneratePomt…

thinkphp6 动态开启debug模式

1、找到config/app.php 2、自定义开启debug参数名称:示例参数为debug,可以根据自己项目情况自定义 3、必须同时设置App::debug 和 Env::set(APP_DEBUG) <?php // ---------------------------------------------------------------------- // | 应用设置 // --------…

TiDB字符集和时区

TiDB 字符集和时区 mysql> select version; -------------------------------------- | version | -------------------------------------- | 5.7.10-TiDB-v2.1.0-beta-179-g5a0fd2d | -------------------------------------- 1 row in set (0.00 sec) mysql> …

谈 Delphi 中 JSON 的简便操作(非常简单)

我曾有讲过Delphi操作JSON的方法&#xff0c;特别是这一篇【delphi】类和记录的 helpers&#xff08;助手&#xff09;。但是因为当时是主要介绍的是Delphi的Helper&#xff0c;大家可能并没注意到Delphi中JSON的简便操作方法。 早期Delphi并没有自己的JSON操作库&#xff0c;大…