Android 12新功能和行为变更
新功能
Material You
Android 12 引入了一种名为 Material You 的新设计语言,可帮助您构建更具个性化、更精美的应用。如需将所有最新的 Material Design 3 更新添加到您的应用中,请试用 Alpha 版 Material Design 组件。
微件改进
Android 12 改进了现有的 Widgets API,以改善平台和启动器中的用户和开发者体验。我们编写了一个指南,帮助您确保您的微件与 Android 12 兼容并使用新功能对其进行更新。
富媒体内容插入
Android 12 引入了一个新的统一 API,可让您的应用从任何可用来源(剪贴板粘贴、键盘输入或拖放操作)接收富媒体内容。
应用启动画面 API
Android 12 为所有应用引入了新的应用启动动画,包括启动时的进入应用运动、显示应用图标的启动画面,以及向应用本身的过渡。如需了解详情,请参阅启动画面开发者指南。
推荐新功能,以便实现流畅的画中画过渡体验
Android 12 对全屏窗口和画中画窗口之间的动画过渡效果进行了重大改进。我们强烈建议您实现所有适用的更改;完成后,这些更改会自动扩展到可折叠设备和平板电脑等大屏幕,而无需您执行进一步操作。
蓝牙权限
Android 12 引入了 BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT 权限。这些权限可让以 Android 12 为目标平台的应用更轻松地与蓝牙设备互动,尤其是不需要访问设备位置信息的应用。
适配方案
val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// 如果是Android 12及更高版本,需要请求蓝牙权限
arrayOf(
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.ACCESS_FINE_LOCATION
)
} else {
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION)
}
更多内容请参考官方文档:蓝牙权限
为 NFC 付款启用屏幕关闭
在以 Android 12 及更高版本为目标平台的应用中,您可以通过将 requireDeviceScreenOn 设置为 false,在设备屏幕未打开的情况下启用 NFC 付款。如需详细了解屏幕关闭或锁定状态下的 NFC 付款,请参阅屏幕关闭和锁定屏幕行为。
其他
- 了解更多功能,请参考官方文档:Android 12 开发者版本。
行为变更
所有应用行为变更
Android 12 平台包含一些行为变更,这些变更可能会影响您的应用。以下行为变更将影响在 Android 12 上运行的所有应用,无论采用哪种 targetSdkVersion 都不例外。您应该测试您的应用,然后根据需要进行修改,以适当地支持这些变更。
应用启动画面
如果您之前在 Android 11 或更低版本中实现了自定义启动画面,则需要将您的应用迁移到 SplashScreen API,以确保它从 Android 12 开始正确显示。如果不迁移您的应用,则可能会导致应用启动体验变差或出乎预期。
大致位置
在搭载 Android 12 或更高版本的设备上,用户可以要求您的应用只能访问大致位置信息。
如果您的应用请求 ACCESS_FINE_LOCATION 运行时权限,您还应请求 ACCESS_COARSE_LOCATION 权限,以便处理用户授予应用大致位置访问权限的情形。您应该在单个运行时请求中包含这两项权限。
移除了 BouncyCastle 实现
Android 12 移除了之前弃用的加密算法的许多 BouncyCastle 实现,包括所有 AES 算法。系统改用这些算法的 Conscrypt 实现。
行为变更:以 Android 12 为目标平台的应用
与早期版本一样,Android 12 包含一些行为变更,这些变更可能会影响您的应用。以下行为变更仅影响以 Android 12 或更高版本为目标平台的应用。如果您的应用以 Android 12 为目标平台,您应该修改自己的应用以适当地支持这些行为(如果适用)。
应用休眠
Android 12 在 Android 11(API 级别 30)中引入的自动重置权限行为的基础上进行了扩展。如果您的应用以 Android 12 为目标平台,并且用户有几个月未与您的应用互动,则系统会自动重置授予的所有权限并将您的应用置于休眠状态。
更安全的组件导出
如果您的应用以 Android 12 或更高版本为目标平台,且包含使用 intent 过滤器的 activity、服务或广播接收器,您必须为这些应用组件显式声明 android:exported 属性。
适配方案:
<activity android:name=".AActivity" android:exported="true" />
待处理 intent 可变性
如果您的应用以 Android 12 为目标平台,您必须为应用创建的每个 PendingIntent 对象指定可变性。这项额外的要求可提高应用的安全性。
适配方案:
如需确定您的应用是否缺少可变性声明,请在 Android Studio 中查找以下 lint 警告:
Warning: Missing PendingIntent mutability flag [UnspecifiedImmutableFlag]
如果您的应用以 Android 12 或更高版本为目标平台,您必须指定应用创建的每个 PendingIntent 对象的可变性。如需声明给定的 PendingIntent 对象可变或不可变,请分别使用 PendingIntent.FLAG_MUTABLE 或 PendingIntent.FLAG_IMMUTABLE 标志。
val pendingIntent = PendingIntent.getActivity(
applicationContext,
REQUEST_CODE, intent,
/* flags */ PendingIntent.FLAG_IMMUTABLE
)
检测不安全的 intent 启动
如果您的应用同时执行以下两项操作,系统会检测到不安全的 intent 启动,并且会发生 StrictMode 违规行为:
- 您的应用从已传递的 intent 的 extra 中解封嵌套 intent。
- 您的应用立即使用该嵌套 intent 启动应用组件,例如将 intent 传递给 startActivity()、startService() 或 bindService()。
更多内容请参考检测不安全的 intent 启动
前台服务启动限制
以 Android 12 或更高版本为目标平台的应用无法在后台运行时启动前台服务,少数特殊情况除外。如果应用尝试在后台运行时启动前台服务,则会引发异常(少数特殊情况除外)。
当您的应用在后台运行时,请考虑使用 WorkManager 来计划和启动加急工作。如需完成用户请求的紧急操作,请按照精确的闹钟启动前台服务。
精确的闹钟权限
为了鼓励应用节省系统资源,以 Android 12 及更高版本为目标平台且设置了精确的闹钟的应用必须能够访问“闹钟和提醒”功能,该功能显示在系统设置的特殊应用访问权限屏幕中。
- 如需获取这种特殊应用访问权限,请在清单中请求 SCHEDULE_EXACT_ALARM 权限。
更多行为变更请参考官方文档:行为变更:以 Android 12 为目标平台的应用