针对从后台启动 activity 的限制

Android 10(API 级别 29)及更高版本对后台应用可启动 activity 的时间施加限制。这些限制有助于最大限度地减少对用户造成的中断,并且可以让用户更好地控制其屏幕上显示的内容。

本指南将通知作为从后台启动 activity 的备选方案进行说明。还列举了不适用于此类限制的个别情况。

改为显示通知

几乎在所有情况下,后台应用都必须显示有时效性的通知以便向用户提供紧急信息,而非直接启动 activity。此类通知包括处理来电或正在响铃的闹钟。

这种基于通知的提醒系统可为用户提供以下若干优势:

  • 当用户使用设备时,系统会显示浮动通知,以便用户作出响应。用户可以维护其当前的上下文并控制他们在屏幕上看到的内容。
  • 有时效性的通知遵循用户的勿扰规则。例如,启用“请勿打扰”功能后,用户可以仅允许特定联系人或重复来电者的来电。
  • 当设备屏幕关闭时,全屏 intent 会立即启动。
  • 在设备的设置屏幕中,用户可以查看哪些应用最近发送了通知(包括来自特定通知渠道的通知)。在该屏幕中,用户可以控制其通知偏好设置。

应用何时可以启动 activity

在 Android 10 或更高版本上运行的应用只有在满足以下一个或多个条件时才能启动 activity:

  • 该应用具有可见窗口,例如在前台运行的 Activity。
  • 该应用在前台任务的返回堆栈中具有一项 activity。
  • 应用在“最近用过”屏幕上现有任务的返回堆栈中有 activity。

  • 应用的某个 activity 刚在不久前启动。

  • 该应用最近对某个 activity 调用了 finish()。这仅适用于在调用 finish() 时,应用在前台中具有一项 activity,或在前台任务的返回堆栈中具有一项 activity 的情况。

  • 该应用具有以下某项受系统约束的服务。这些服务可能需要启动界面。

  • 应用中的某个服务受另一个可见应用约束。绑定到该服务的应用必须保持可见,以便后台应用成功启动 activity。

  • 应用会从系统收到通知 PendingIntent。如果存在针对服务和广播接收器的待定 intent,则该应用可以在待定 intent 发送后启动 activity 几秒钟时间。

  • 应用收到另一个可见应用发送的 PendingIntent

  • 应用收到它应该在其中启动界面的系统广播。例如 ACTION_NEW_OUTGOING_CALLSECRET_CODE_ACTION。应用可在广播发送几秒钟后启动 Activity。

  • 该应用已通过 CompanionDeviceManager API 与配套硬件设备相关联。借助此 API,应用可以启动 activity 以响应用户在配对设备上执行的操作。

  • 该应用是在设备所有者模式下运行的设备政策控制器。示例用例包括完全托管的企业设备,以及数字标识牌和自助服务终端等专用设备

  • 用户向应用授予了 SYSTEM_ALERT_WINDOW 权限。

从 PendingIntent 启动 activity 时需要用户选择启用

为避免根据所列条件允许意外启动 activity,从 Android 14 开始,您可以使用明确的 API 选择是否向应用授予 activity 启动权限。

以 Android 15 或更高版本为目标平台的应用将默认不再向其创建的 PendingIntents 隐式授予后台 activity 启动 (BAL) 权限。必须明确选择启用,为此,请根据应用是发送还是创建 PendingIntents 来选择以下选项。

待处理 intent 表
图 1:后台 activity 启动决策流程。

由 PendingIntent 的发件人发送

以 Android 14 或更高版本为目标平台且想要启动 PendingIntent 的应用必须满足以下条件:

  • 满足所列条件
  • 选择根据这些例外情况允许后台 activity 启动

只有当应用开发者知道应用要启动 activity 时,才应选择启用此功能。

如需选择启用,应用应通过 setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)ActivityOptions 软件包传递给 PendingIntent.send() 或类似方法。

由 PendingIntent 的创建者执行

现在,如果以 Android 15 或更高版本为目标平台且创建了 PendingIntent 的应用希望在所列条件下启动这些 PendingIntents,则必须明确选择启用后台 activity 启动功能。

在大多数情况下,启动 PendingIntent 的应用应选择启用。不过,如果创建应用需要授予这些特权,则需要满足以下条件:

  • 在创建应用可见的任何时间都可以启动 PendingIntent
  • 如果创建应用具有特殊权限,则可以随时启动 PendingIntent

如需选择启用,应用应将包含 setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)ActivityOptions 软件包传递给 PendingIntent.getActivity() 或类似方法。

如需了解详情,请参阅相关参考文档: