Android 12(S) 版本适配指南

2023-11-04

前言

系统行为变更通常属于以下两种类别之一:

  • 面对所有应用的行为变更: 运行在该系统版本上的所有应用都会影响,而无论应用的targetSDKVersion为何。通常应该先针对这些变更进行适配和测试,这有助于用户在新版本系统上运行你的应用时,用户体验不会受损。
  • 以特定targetSDKVersion为目标版本的行为变更: 只有targetSDKVersion高于或等于系统版本的应用会受影响,通常是影响较大或适配工作量较大的变更,我们可以理解为 Google留给开发者的适配缓冲。

影响所有App的行为变更

1.应用启动画面

从Android 12 系统开始,所有应用的冷启动和温启动期间,系统会使用新的 SplashScreen API 来启动应用启动动画。

启动画面的可自定义元素
(1)应用图标:应该是矢量可绘制对象,它可以是静态或动画形式。虽然动画的时长可以不受限制,但建议不超过1000毫秒。默认情况下,使用启动器图标。
(2)图标背景:可选,在图标与窗口背景之间需要更高的对比度时图标背景很有用。
(3)前景遮罩:可选,前景的三分之一被遮盖。
(4)窗口背景:由不透明单色组成。如果窗口背景已设置且为纯色,则未设置相应的属性时默认使用该背景。

在SplashScreen API之前,我们通常是利用 SplashActivity 的背景图 android:windowBackground来实现应用启动转场效果,这个大家都很熟悉了。如果你不做任何适配,那么根据你配置的 windowBackground 资源值,在 Android 12 上会有不同的效果:

  • windowBackground 采用 @color/单色,则系统会使用该单色和应用的启动图标来构成启动效果,这可能与预期效果不符。
  • windowBackground 采用@drawable/图片,则系统会继续使用该图片来构成启动效果,这个体验与低版本系统一致。
    因此,如果你的应用采用的是 windowBackground 为图片资源的方式,那么你不适配也没有问题。需要升级启动效果的话,推荐参考一下资料:
  • 启动画面 — — Android官方文档
  • Jetpack新成员SplashScreen:打造全新的App启动画面 — — TechMerger

2.麦克风和摄像头切换开关

从Android 12开始,用户可以通过状态栏下拉菜单中两个新增的切换开关选项,一键启用/停用摄像头和麦克风使用权限。
这里的「使用权限」针对的是设备上的所有App,是全局的,不要和Android 6.0的「运行时权限」混淆。

如果用户主动关闭了摄像头或麦克风的使用权限,那么当下次App再需要启动摄像头或麦克风时,系统就会提醒用户,
相关硬件的使用权限已关闭,并申请重新开启。

3.activity生命周期改进

Android 12修改了 Android Task根 Activity在处理”返回键“时的默认行为。在旧版本中,返回键会执行 finish activity,而从 Android 12开始会将 Task 任务栈切换到后台。此后,用户返回应用将执行温启动,应用的温启动简单的多,系统的工作只是将activity 恢复到前台。

影响目标API级别为Android 12 的App的行为变更

1.更安全的组件导出

以Android 12为目标平台的App,如果其包含的四大组件中使用到了 intent 过滤器(intent-filter),则必须显示声明 android:exported 属性,否则App将无法在 Android 12 及更高系统版本的设备上安装。

适配方案

1.如果是自身项目使用到了,则按要求显示声明即可

2.如果是依赖的第三方库使用到了,两种解决方法:

  • Android Studio Project 在打包时会合并多个Module的AndroidManifest.xml 文件的,基于这种情况,可以通过编写 Gradle 脚本,在打包过程中检索合并后的 AndroidManifest.xml文件中,所有使用到了Intent过滤器但没有声明 exported属性的组件,动态为其加上 exported 属性。脚本地址
  • 在主工程中xml拷贝相关component声明,并覆盖exported设置,例如:
 android:exported="true"
 tools:replace="android:exported"

2.PendingIntent可变性

以 Android 12为目标平台的App,在构建PendingIntent时,需要指定Flag为FLAG_IMMUTABLE(建议)或FLAG_MUTABLE二者之一,否则App将崩溃。

3.前台服务启动限制

Android 12 对应用从后台启动前台服务的行为做出限制,除了后台启动限制的豁免 等少数情况外,如果应用尝试在后台运行时启动前台服务,系统会抛出ForegroundServiceStartNotAllowedException异常。

应用可以使用WorkManager的加急工作来执行后台任务。

4.精确的闹钟权限

Android 12系统引入了新的权限 android.permission.SCHEDULE_EXACT_ALARM,设置AlarmManager 精准闹钟的应用必须在 Manifest中请求 SCHEDULE_EXACT_ALARM 权限。

新增了一个新的API — — canScheduleExactAlarms(),用于检查应用的精准闹钟权限状态。

5.通知 trampoline 限制

通知 trampoline(蹦床)是指利用广播接收器或服务间接启动目标 Activity(用户与通知交互后,应用先启动服务或广播接收器作为中介,再去启动 Activity )。Android 12系统对通知 trampoline 做出限制,当应用尝试从通知 trampoline启动 activity,系统会拦截该启动行为。
如果你的应用使用了通知 trampoline,那么你需要切换为常规的 PendingInternt 方式。

6.大致位置

Android系统支持两个精度级别的位置信息,并且分别对应一个权限。虽然有两个精度级别的权限,但是因为它们处于同一权限组中,所以应用只要请求授予其中一个权限,另一个权限就自动授予了。

  • 粗略位置: 精确到2平方公里的位置值,请求 ACCESS_COARSE_LOCATION 权限可以获得。
  • 精确位置: 精确到50米以内的位置值,请求 ACCESS_FINE_LOCATION 权限可以获得。

从Android 12 开始,用户可以只授予应用模糊位置 ACCESS_COARSE_LOCATION 权限,即使应用请求的是精确位置 ACCESS_FINE_LOCATION 权限。

7.应用休眠

Android 11引入了应用休眠机智,如果用户有几个月没有与应用交互,那么系统会将应用置于休眠/冬眠状态,Android 12扩展了应用休眠机智:

  • Android 11:重置已授予的运行时敏感权限;
  • Android 12:重置已授予的运行时敏感权限;无法从后台运行任务;无法接受推送通知;应用缓存文件会被删除。

8.自定义通知

从 Android 12开始,系统规范了自定义通知的外观和行为,自定义通知的内容区域缩小为自定义通知模板内的一块区域,不再完整覆盖通知区域。下图为统一的自定义通知模板:
在这里插入图片描述
由于所有通知都是可展开的,所以需要调用 setCustomBigContentView()设置展开后布局,确保展开和收起状态一致。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 12(S) 版本适配指南 的相关文章

随机推荐

  • 每日一题:从前序与中序遍历序列(C++)

    题目描述 根据一棵树的前序遍历与中序遍历构造二叉树 注意 你可以假设树中没有重复的元素 例如 给出 前序遍历 preorder 3 9 20 15 7 中序遍历 inorder 9 3 15 20 7 返回如下的二叉树 3 9 20 15
  • html、vue、uni-app微信小程序的区别

    传统的h5只有1端 即浏览器 而uni app可跨多端 虽仍属前端 与传统h5有不同 网络模型的变化 以前网页大多是b s 服务端代码混合在页面里 现在是c s 前后端分离 通过js api 类似ajax的uni request 获取jso
  • opencv读取rtsp的一些优化

    用队列将同步转为异步 import cv2 import queue import time import threading q queue Queue def Receive print start Reveive cap cv2 Vi
  • 迅雷链同构多链框架解析

    本文转载自迅雷官方微信群 传统意义上的 甚至是消费者端熟知的迅雷 是那家唯一在美国上市的中国下载服务商 主营业务还是在线广告 游戏和会员 迅雷从2015年开始对分布式计算和区块链领域的布局 这几年 迅雷布局了CDN 推出了C端的赚钱宝和玩客
  • Notepad++ 支持markdown语法

    之前windows下想编写markdown只是通过有道云笔记来写 看的时候简单的就直接用notepad 看 有些语法得导入到有道云笔记中看很不方便 搜索windows下的markdown编辑工具 Typora sublime markdow
  • myBase7安全破解的方法

    转自https blog csdn net weixin 42414714 article details 89642305 首先 保证myBase7是关闭状态 然后执行以下步骤 1 找到myBase7的安装目录 右击mybase的启动图标
  • 用Python预测收入,来看看你的收入到底应该是多少?

    Python界的网红机器学习 这股浪潮已经逐渐成为热点 而Python是机器学习方向的头牌语言 用机器学习来玩一些好玩的项目一定很有意思 比如根据你的职业 婚姻 家庭 教育时间等等来预测你的收入 这么神奇 不信的话 一起跟我往下看 1 数据
  • 如何使用chatGPT进行论文润色(中英文均可)

    1 为什么ChatGPT可以进行论文润色 ChatGPT本质是一个基于GPT3 5 应用在对话场景的超大语言模型 在各种数据集上经过训练而来的 很好的掌握了语言的 本质 特征 自然可以进行语言相关的工作 论文润色只是小事情 2 如何使用ch
  • 搭建简单的神经网络——使用pytorch实现鸢尾花的分类

    最近写毕业论文 看到网上的pytorch入门nn方法乱七八糟 遂写了本篇方法 好让更多的人可以使用pytorch实现简单的神经网络方法 version python 3 7 9 pytorch 1 7 0 function 利用神经网络进行
  • 区块链中的:哈希算法

    什么是哈希算法 哈希算法 又称散列算法 它是一个单向函数 可以把任意长度的输入数据转化为固定长度的输出 h H x h H x h H x 例如 对 morning 和 bitcoin 两个输入进行某种哈希运算 得到的结果是固定长度的数字
  • 当根据条件查询数据库中记录没有,但是又想返回0怎么办?

    我们平时在操作数据库的时候 对于null的记录或者字段相信大家都可以用ifnull 来判断为null的时候需求返回什么数据 但是如果根据条件查询的时候 数据库根本没有这条记录但是又想返回数据不存在时候的结果该怎么办 比如你统计一个时间区间的
  • 关于g2o的使用笔记

    文章目录 前言 一 g2o进行非线性优化 二 g2o进行前端位姿优化 三 g2o进行后端位姿优化 总结 前言 g2o是比较流行的图优化库 在视觉slam中的应用非常广泛 关于如何利用g2o求解BA优化问题 在此作个笔记 以供后面的学习中方便
  • webRTC的标准与发展

    Web实时通信 WebRTC 是标准 协议和JavaScript API的集合 两者的组合可实现浏览器 对等 之间的对等音频 视频和数据共享 WebRTC无需依赖第三方插件或专有软件 而是将实时通信转变为任何Web应用程序都可以通过简单的J
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 一觉睡醒,ChatGPT 竟然被淘汰了?

    点击上方 码农突围 马上关注 这里是码农充电第一站 回复 666 获取一份专属大礼包 真爱 请设置 星标 或点个 在看 来源丨转自公众号 机器之心 编辑 杜伟 陈萍 OpenAI 的 Andrej Karpathy 都大力宣传 认为 Aut
  • Stream流(入门篇)

    目录 前言 1 Stream流概述 2 获取Stream流的方式 2 1 单列集合获取Stream流 2 2 双列集合获取Stream流 2 3 数组获取Stream流 2 4 零散数据获取Stream流 3 Stream流的中间方法 4
  • mybatisplus 增删改查&使用技巧

    一 查询条件使用 单个查询 如果返回多条会抛异常 User user userService getOne Wrappers
  • Docker-compose安装mysql

    介绍 本系列文章主要介绍使用docker compose部署mysql nginx redis等中间件 前后分离微服务项目部署流程 不介绍docker安装以及基础命令 话不多说首先进入mysql安装教学 操作 首先创建个目录用来存放dock
  • vue2和vue3的10种组件通信

    vue2和vue3的10种组件通信
  • Android 12(S) 版本适配指南

    前言 系统行为变更通常属于以下两种类别之一 面对所有应用的行为变更 运行在该系统版本上的所有应用都会影响 而无论应用的targetSDKVersion为何 通常应该先针对这些变更进行适配和测试 这有助于用户在新版本系统上运行你的应用时 用户