Android 12新功能和行为变更

34 阅读6分钟

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 上运行的所有应用,无论采用哪种 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 为目标平台的应用

Android 12 保姆级适配指南