行为变更:所有应用

Android 13 平台包含可能影响您应用的行为变更。以下行为变更适用于在 Android 13 上运行的所有应用,无论targetSdkVersion如何。您应该测试您的应用,然后根据需要对其进行修改以适当地支持这些变更(如果适用)。

请务必还查看仅影响以 Android 13 为目标平台的应用的行为变更列表。

性能和电池

任务管理器

At the bottom of the notification drawer is a button that indicates the
  number of apps that are currently running in the background. When you press
  this button, a dialog appears that lists the names of different apps. The
  Stop button is to the right of each app
图 1. 任务管理器的流程,允许用户停止具有正在进行的前台服务的应用。此流程仅出现在运行 Android 13 或更高版本的设备上。

从 Android 13(API 级别 33)开始,用户可以从通知抽屉完成一个流程来停止具有正在进行的前台服务的应用,如图 1 所示。此功能称为任务管理器。应用必须能够处理此用户发起的停止操作

使用 JobScheduler 改善预取作业处理

JobScheduler 提供了一种方法,允许应用将特定作业标记为“预取”作业(使用JobInfo.Builder.setPrefetch()),这意味着它们应该理想地接近下一次应用启动并在其之前运行以改善用户体验。从历史上看,JobScheduler 仅使用此信号让预取作业有机会使用空闲或多余的数据。

在 Android 13(API 级别 33)及更高版本中,系统尝试确定应用下次启动的时间,并使用该估计值运行预取作业。应用应尝试将预取作业用于希望在下一次应用启动前完成的任何工作。

电池资源利用率

Android 13(API 级别 33)提供了以下方法,以便系统更好地管理设备电池寿命

  • 系统将您的应用置于“受限”应用待机桶中的规则已更新。“受限”应用待机桶
  • 当用户将您的应用置于后台电池使用情况的“受限”状态时,您的应用可以执行的工作新增了一些限制。“受限”状态

在使用这些更改测试您的应用时,请确保检查以下事项

  • 测试您的应用在系统将其置于“受限”应用待机桶时如何响应。“受限”应用待机桶。使用以下 Android 调试桥 (ADB) 命令将您的应用分配到此桶

    adb shell am set-standby-bucket PACKAGE_NAME restricted
    
  • 测试您的应用如何响应以下限制,这些限制通常适用于处于后台电池使用情况的“受限”状态的应用。“受限”状态

    • 无法启动前台服务
    • 现有的前台服务将从前台移除
    • 不会触发警报
    • 不会执行作业

    使用以下 ADB 命令将您的应用置于此“受限”状态

    adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
    

高优先级 Firebase Cloud Message (FCM) 配额

Android 13(API 级别 33)更新了 Firebase Cloud Messaging (FCM) 配额,以提高针对响应高优先级 FCM 显示通知的应用的高优先级 FCM 传递的可靠性。Android 13(API 级别 33)中的以下内容已更改

  • 应用待机桶 不再确定应用可以使用多少个高优先级 FCM。
  • 高优先级 FCM 配额与响应高优先级 FCM 显示给用户的通知数量成正比。

与 Android 的先前版本一样,超过配额的高优先级 FCM 将降级为普通优先级。在响应 FCM 启动 前台服务 (FGS) 时,我们建议检查 RemoteMessage.getPriority() 的结果,并确认它是 PRIORITY_HIGH 和/或处理任何潜在的 ForegroundServiceStartNotAllowedException 异常。

如果您的应用并非始终响应高优先级 FCM 发布通知,我们建议您将这些 FCM 的优先级更改为**普通**,以便导致通知的消息不会被降级。

隐私

通知的运行时权限

Android 13(API 级别 33)引入了运行时 通知权限POST_NOTIFICATIONS。此更改可帮助用户专注于对他们最重要的通知。

我们强烈建议您尽快以 Android 13 或更高版本为目标,以获得此功能的额外控制和灵活性的效果。

详细了解 应用权限最佳实践

隐藏剪贴板中的敏感内容

如果您的应用允许用户将敏感内容(例如密码或信用卡信息)复制到剪贴板,则必须在调用 ClipboardManager#setPrimaryClip() 之前向 ClipData 的 ClipDescription 添加一个标志。添加此标志可以防止敏感内容出现在内容预览中。

Copied text preview without flagging sensitive content
未标记敏感内容的复制文本预览。
Copied text preview flagging sensitive content.
标记敏感内容的复制文本预览。

要标记敏感内容,请向 ClipDescription 添加一个布尔型额外内容。所有应用都应执行此操作,无论目标 API 级别如何。


// When your app is compiled with the API level 33 SDK or higher
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
    }
}

// If your app is compiled with a lower SDK
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean("android.content.extra.IS_SENSITIVE", true)
    }
}

要详细了解新的剪贴板 UI,请访问 复制和粘贴 功能页面。

安全

迁移远离共享用户 ID

如果您的应用使用已弃用的 android:sharedUserId 属性,并且不再依赖于该属性的功能,则可以将 android:sharedUserMaxSdkVersion 属性设置为 32,如以下代码片段所示

<manifest ...>
    <!-- To maintain backward compatibility, continue to use
         "android:sharedUserId" if you already added it to your manifest. -->
    android:sharedUserId="SHARED_PACKAGE_NAME"
    android:sharedUserMaxSdkVersion="32"
    ...
</manifest>

此属性告诉系统您的应用不再依赖于共享用户 ID。如果您的应用声明了 android:sharedUserMaxSdkVersion 并且是在运行 Android 13 或更高版本的设备上新安装的,则您的应用的行为就像您从未定义过 android:sharedUserId 一样。更新后的应用仍将使用现有的共享用户 ID。

共享用户 ID 会导致包管理器中的行为不确定。您的应用应改为使用适当的通信机制(例如服务和内容提供程序)来促进共享组件之间的互操作性。

用户体验

可关闭的前台服务通知

在运行 Android 13 或更高版本的设备上,用户默认可以关闭与前台服务关联的通知

核心功能

删除语音服务实现的旧版本

Android 13 从 Google 应用中删除了 SpeechService 实现(包括语音 IME、RecognitionService 和基于 意图 的 API)。

在 Android 12 中,发生了以下更改

  • SpeechService 功能已迁移到 Google 语音服务应用,该应用成为默认的 SpeechService 提供程序。
  • RecognitionService 功能已移至 Android 系统智能应用,以支持设备上的语音识别。

为了帮助在 Android 12 上维护应用兼容性,Google 应用使用一个跳板将流量转移到 Google 语音服务应用。在 Android 13 中,此跳板已删除。

应用应使用设备的默认提供程序用于 SpeechService,而不是硬编码特定应用。