针对从后台启动 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 时,才应 执行此选择启用操作。

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

通过 PendingIntent 的创建方

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

在大多数情况下,启动 PendingIntent 的应用应选择启用。 但是,如果创建应用需要授予这些权限:

  • 只要创建应用可见,就可以随时启动 PendingIntent
  • 如果创建应用具有特殊权限,则可以随时启动 PendingIntent

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

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

严格模式

从 Android 16 开始,应用开发者可以启用 严格模式,以便在 activity 启动被阻止时(或在应用的目标 SDK 升级时面临被阻止的风险)收到 通知。

以下示例代码用于在应用、activity 或其他应用组件的 Application.onCreate() 方法中尽早启用:

 override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     StrictMode.setVmPolicy(
         StrictMode.VmPolicy.Builder()
         .detectBlockedBackgroundActivityLaunch()
         .penaltyLog()
         .build());
     )
 }

如需了解详情,请参阅严格模式文档。