将 Android 工程的 targetSdkVersion 从 30 (Android 11)升级到 31(Android 12)需要关注一些重要的行为变更和适配点。

        主要适配要点:

适配类别关键变更点适配紧迫性简要说明
组件导出属性声明了 Intent Filter 的组件必须显式设置 android:exported 属性强制避免组件被意外调用,提升安全性。
PendingIntent必须显式声明可变性标志强制指定 FLAG_MUTABLE 或 FLAG_IMMUTABLE 以明确意图。
前台服务限制从后台启动前台服务强制除特定情况外,应用在后台时无法启动前台服务。
自定义通知自定义通知视图使用系统标准模板强制自定义通知的内容区域不再覆盖整个通知区域,需检查布局适配性。
应用启动动画引入新的 SplashScreen API推荐提供一致的应用启动体验,建议替换自定义启动页。
隐私和安全近似位置权限、麦克风和摄像头指示器、剪贴板访问提示等强制/推荐增强用户隐私保护,需适配新的权限模型和提示。

1. 组件导出属性 (android:exported)

        问题:在 Android 12 中,所有包含了 intent-filter 的 ActivityServiceBroadcast、Receiver 都必须显式声明 android:exported 属性,明确指示该组件是否允许被其他应用调用。

        适配方案:检查你的 AndroidManifest.xml 文件,为所有包含 <intent-filter> 的组件添加 android:exported 属性。

<activityandroid:name=".YourActivity"android:exported="true"> <!-- 明确设置 exported 值 --><intent-filter><action android:name="android.intent.action.VIEW" /></intent-filter>
</activity><serviceandroid:name=".YourService"android:exported="false"> <!-- 仅限内部使用 -->
</service><receiverandroid:name=".YourReceiver"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /></intent-filter>
</receiver>

        注意android:exported="true" 表示允许外部应用调用,false 则表示不允许。缺乏此声明在 Android 12 及以上版本会导致安装失败或运行时错误,如下:

2. PendingIntent 可变性

问题:Android 12 要求为创建的每个 PendingIntent 对象显式指定其可变性标志:FLAG_MUTABLE 或 FLAG_IMMUTABLE

适配方案:检查所有创建 PendingIntent 的代码。

// 创建一个可变的 PendingIntent(通常用于需要被其他应用修改的 Intent)
PendingIntent mutablePendingIntent = PendingIntent.getActivity(context,requestCode,intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE // 添加 FLAG_MUTABLE
);// 创建一个不可变的 PendingIntent(安全性更高,推荐只要不需要修改 Intent 就使用此选项)
PendingIntent immutablePendingIntent = PendingIntent.getActivity(context,requestCode,intent,PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE // 添加 FLAG_IMMUTABLE
);

原则:如果不需要让其他应用修改你的 PendingIntent 所包装的 Intent优先使用 FLAG_IMMUTABLE,这样更安全。

3. 前台服务启动限制

问题:Android 12 开始,应用在处于后台时,通常无法启动前台服务。这是为了节省电量和管理资源。否则会抛出 ForegroundServiceStartNotAllowedException

适配方案

  • 评估需求:确认是否必须在后台启动前台服务。许多后台任务可以用 WorkManager 来调度和执行。

  • 使用替代方案:优先考虑使用 WorkManager 的加急作业(Expedited Work)来处理需要立即执行的后台任务。

// WorkManager 示例 (使用加急作业)
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(YourWorker.class).setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) // 设置加急.build();
WorkManager.getInstance(context).enqueue(request);
  • 检查例外情况:如果你的场景确实符合后台启动前台服务的少数例外条件(例如,由于用户操作,如点击通知、小部件;或者特定的系统事件回调),请确保正确配置并准备好处理可能的异常。

4. 自定义通知样式

问题:Android 12 改变了完全自定义通知的视觉效果。系统会使用一个标准模板来装饰所有通知,自定义布局只能占据模板内指定区域,而不再是整个通知区域。

适配方案

  • 测试通知外观:务必在 Android 12 设备上测试所有自定义通知,确保布局正确显示。

  • 使用标准样式:尽可能使用系统的标准通知样式和扩展布局(如 InboxStyleBigPictureStyle),它们能更好地适应不同版本。

  • 提供展开式布局:如果必须使用自定义视图,确保同时为展开状态提供布局(setCustomBigContentView)。

5. 应用启动画面 (Splash Screen)

问题:Android 12 引入了统一的应用启动画面 API(SplashScreen)。系统会为所有应用默认显示一个启动画面,该画面由应用的启动图标和主题的 windowBackground 组成。

适配方案

  • 接受默认效果:如果不介意默认效果,可以不做任何改动。

  • 定制启动画面(推荐):若要自定义,请使用 Jetpack 的 SplashScreen 兼容库,它可以在 Android 12 之前和之后的版本上提供一致的体验。

  1. 添加依赖:implementation "androidx.core:core-splashscreen:1.0.1"

  2. 定义主题,继承 Theme.SplashScreen

  3. 在 AndroidManifest.xml 中将该主题应用于启动 Activity。

  4. 在 Activity 中安装 Splash Screen。

6. 隐私和安全增强

Android 12 引入了多项隐私改进,部分会影响所有应用,部分仅针对 targetSdkVersion 31+的应用:

  • 近似位置权限:用户可以仅授予应用大致位置(模糊位置)权限。如果你的应用需要精确定位,需要在运行时明确向用户解释为何需要,并妥善处理用户只授予大致位置的情况。

  • 麦克风和摄像头指示器:当应用使用麦克风或摄像头时,状态栏会出现相应图标8。确保你的应用只在必要时访问这些传感器,并妥善处理用户可能因此产生的疑虑。

  • 剪贴板访问提示:当应用读取来自其他应用的剪贴板内容时,系统会显示提示 toast8。避免不必要的剪贴板读取。

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

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

相关文章

利用OpenCV实现模板与多个对象匹配

代码实现&#xff1a;import cv2 import numpy as npimg_rgb cv2.imread(mobanpipei.jpg) img_gray cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template cv2.imread(jianto.jpg, flags0) h, w template.shape[:2]# 读取图像# # 顺时针旋转 90 度&#xff08;k1&#xff0…

OS28.【Linux】自制简单的Shell的修bug记录

目录 1.问题代码 2.排查 前期检查 查找是谁修改了environ[0] 使用gdb下断点 查看后续的影响 分析出问题的split_commandline函数 3.反思 4.正确代码 5.结论 6.除此之外...... ★提示: 此bug非常隐蔽,不仔细分析很难查出问题,非常锻炼调试能力! 1.问题代码 #includ…

Debian 系统上安装与配置 MediaMTX

&#x1f3af; 在 Debian 系统上安装与配置 MediaMTX&#xff08;原 rtsp-simple-server&#xff09;&#xff1a;打造轻量级流媒体服务器 作者&#xff1a;远在太平洋 环境&#xff1a;Debian 10/11/12 | Ubuntu 可参考 关键词&#xff1a;MediaMTX、rtsp-simple-server、RTSP…

分布式专题——10.4 ShardingSphere-Proxy服务端分库分表

1 为什么要有服务端分库分表&#xff1f; ShardingSphere-Proxy 是 ShardingSphere 提供的服务端分库分表工具&#xff0c;定位是“透明化的数据库代理”。 它模拟 MySQL 或 PostgreSQL 的数据库服务&#xff0c;应用程序&#xff08;Application&#xff09;只需像访问单个数据…

Mysql相关的面试题1

什么是聚集索引&#xff08;聚簇索引&#xff09;&#xff1f;什么是二级索引&#xff08;非聚簇索引&#xff09;&#xff1f; 聚集索引就是叶子节点关联行数据的索引&#xff0c;二级索引就是叶子节点关联主键的索引&#xff0c;聚集索引必须有且仅有一个&#xff0c;二级索引…

电涌保护器:为现代生活筑起一道隐形防雷网

何为电涌保护器&#xff1f;电涌保护器&#xff08;Surge Protective Device&#xff0c;简称SPD&#xff09;主要用于控制信号系统&#xff0c;保护电气电子设备信号线路免受雷电电磁脉冲、感应过电压、操作过电压的影响&#xff0c;广泛应用于工控、消防、安防监控、交通、电…

【uniapp微信小程序】扫普通链接二维码打开小程序

需求&#xff1a;用户A保存自己的邀请码海报&#xff0c;用户B扫描该普通连接二维码&#xff0c;打开微信小程序&#xff0c;并且携带用户A的邀请码信息&#xff0c;用户B登录时&#xff0c;跟用户A关联&#xff0c;成为用户A的下级。 tips&#xff1a;保存海报到手机相册可以参…

LeetCode 378 - 有序矩阵中第 K 小的元素

文章目录摘要描述题解答案题解代码分析代码解析示例测试及结果输出结果时间复杂度空间复杂度总结摘要 在开发中&#xff0c;我们经常遇到需要处理大规模有序数据的场景&#xff0c;比如数据库分页、排行榜查询、或者处理排序过的矩阵。LeetCode 第 378 题“有序矩阵中第 K 小的…

【Lua】Windows 下编写 C 扩展模块:VS 编译与 Lua 调用全流程

▒ 目录 ▒&#x1f6eb; 导读需求环境1️⃣ 核心原理&#xff1a;Windows下Lua与C的交互逻辑2️⃣ Windows下编写步骤&#xff1a;以mymath模块为例2.1 步骤1&#xff1a;准备Windows开发环境方式1&#xff1a;官网下载Lua源码并编译&#xff08;可控性高&#xff09;方式2&am…

Python快速入门专业版(二十九):函数返回值:多返回值、None与函数嵌套调用

目录引一、多返回值&#xff1a;一次返回多个结果的优雅方式1. 多返回值的本质&#xff1a;隐式封装为元组示例1&#xff1a;返回多个值的函数及接收方式2. 多返回值的接收技巧技巧1&#xff1a;用下划线_忽略不需要的返回值技巧2&#xff1a;用*接收剩余值&#xff08;Python …

python使用pip安装的包与卸载

1&#xff1a;基本卸载命令 # 卸载单个包 pip uninstall package_name# 示例&#xff1a;卸载requests包 pip uninstall requests2&#xff1a;卸载多个包 # 一次性卸载多个包 pip uninstall package1 package2 package3# 示例 pip uninstall requests numpy pandas3&#xff1…

超级流水线和标量流水线的原理

一、什么是流水线&#xff1f;要理解这两个概念&#xff0c;首先要明白流水线&#xff08;Pipelining&#xff09; 的基本思想。想象一个汽车装配工厂&#xff1a;* 没有流水线&#xff1a;一个工人负责组装一整辆汽车&#xff0c;装完一辆再装下一辆。效率很低。* 有了流水线&…

【Ansible】管理复杂的Play和Playbook知识点

1.什么是主机模式&#xff1f;答&#xff1a;主机模式是Ansible中用于从Inventory中筛选目标主机的规则&#xff0c;通过灵活的模式定义可精准定位需要执行任务的主机。2.主机模式的作用答&#xff1a;筛选目标&#xff1a;从主机清单中选择一个或多个主机/组&#xff0c;作为P…

FastGPT源码解析 Agent 智能体应用创建流程和代码分析

FastGPT对话智能体创建流程和代码分析 平台作为agent平台&#xff0c;平台所有功能都是围绕Agent创建和使用为核心的。平台整合各种基础能力&#xff0c;如大模型、知识库、工作流、插件等模块&#xff0c;通过可视化&#xff0c;在界面上创建智能体&#xff0c;使用全部基础能…

缺失数据处理全指南:方法、案例与最佳实践

如何处理缺失数据&#xff1a;方法、案例与最佳实践 1. 引言 在数据分析和机器学习中&#xff0c;缺失数据是一个普遍存在的问题。如何处理缺失值&#xff0c;往往直接影响到后续分析和建模的效果。处理不当&#xff0c;不仅会浪费数据&#xff0c;还可能导致模型预测结果的不准…

为什么Cesium不使用vue或者react,而是 保留 Knockout

1. Knockout-ES5 插件的语法简化优势 自动深度监听&#xff1a;Cesium 通过集成 Knockout-ES5 插件&#xff0c;允许开发者直接使用普通变量语法&#xff08;如 viewModel.property newValue&#xff09;替代繁琐的 observable() 包装&#xff0c;无需手动声明每个可观察属性。…

Word怎么设置页码总页数不包含封面和目录页

有时候使用页码格式是[第x页/共x页]或[x/x]时会遇到word总页数和实际想要的页数不一致&#xff0c;导致显示不统一&#xff0c;这里介绍一个简单的办法&#xff0c;适用于比较简单的情况。 一、wps版本 文章分节 首先将目录页与正文页进行分节&#xff1a;在目录页后面选择插入…

突破机器人通讯架构瓶颈,CAN/FD、高速485、EtherCAT,哪种总线才是最优解?

引言&#xff1a; 从协作机械臂到人形机器人&#xff0c;一文拆解主流总线技术选型困局 在机器人技术飞速发展的今天&#xff0c;从工厂流水线上的协作机械臂到科技展会上的人形机器人&#xff0c;它们的“神经系统”——通讯总线&#xff0c;正面临着前所未有的挑战。特斯拉O…

Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)

1. Java是什么&#xff1f; Java首先是一种编程语言。它拥有特定的语法、关键字和结构&#xff0c;开发者可以用它来编写指令&#xff0c;让计算机执行任务。核心特点&#xff1a; Java最著名的特点是“一次编写&#xff0c;到处运行”&#xff08;Write Once, Run Anywhere - …

OSPF高级技术 相关知识点

1.多区域OSPFospf 设计多区域原因&#xff1a;① 每个区域的路由器只需同步自己所在区域的链路状态数据库&#xff0c;分区域设 计可以使得每个区域的链路状态数据库得以减少。以降低路由器cpu、内存 的消耗。② 避免某区域内的网络故障&#xff08;例如&#xff1a;接口频繁up…