从后台启动活动的限制

Android 10(API 级别 29)及更高版本在应用在后台运行时,限制了应用何时可以启动活动。这些限制有助于最大程度地减少对用户的干扰,并让用户更好地控制屏幕上显示的内容。

本指南介绍了通知作为从后台启动活动的替代方案。它还列出了不适用此限制的具体情况。

改为显示通知

在几乎所有情况下,后台应用都必须显示时间敏感的通知以向用户提供紧急信息,而不是直接启动活动。此类通知包括处理来电或活动闹钟。

此基于通知的警报和提醒系统为用户提供了多项优势

  • 使用设备时,用户会看到一个抬头通知,让他们可以做出响应。用户可以保持其当前上下文,并控制他们在屏幕上看到的内容。
  • 时间敏感的通知会尊重用户的勿扰规则。例如,当启用勿扰模式时,用户可能只允许来自特定联系人或重复呼叫者的呼叫。
  • 当设备屏幕关闭时,全屏 Intent 会立即启动。
  • 在设备的设置屏幕中,用户可以看到哪些应用最近发送了通知,包括来自特定通知渠道的通知。从此屏幕,用户可以控制其通知偏好设置。

应用何时可以启动活动

在 Android 10 或更高版本上运行的应用在满足以下一个或多个条件时可以启动活动

  • 应用具有可见窗口,例如前台的 Activity。
  • 应用在前台任务的返回栈中有一个 Activity。
  • 应用在最近使用的应用屏幕上现有任务的返回栈中有一个 Activity。

  • 应用有一个最近启动的 Activity。

  • 应用最近在 Activity 上调用了finish()。仅当应用在调用finish()时在前台具有 Activity 或在前台任务的返回栈中具有 Activity 时,此规则才适用。

  • 应用具有以下其中一项由系统绑定的服务。这些服务可能需要启动 UI。

  • 应用有一个由其他可见应用绑定的服务。绑定到该服务的应用必须保持可见状态,以便后台应用才能成功启动 Activity。

  • 应用从系统接收通知PendingIntent。对于服务和广播接收器的挂起意图,应用可以在发送挂起意图后几秒钟内启动 Activity。

  • 应用接收来自其他可见应用的PendingIntent

  • 应用接收系统广播,其中应用需要启动 UI。例如,ACTION_NEW_OUTGOING_CALLSECRET_CODE_ACTION。应用可以在发送广播后几秒钟内启动 Activity。

  • 应用通过CompanionDeviceManager API 与配套硬件设备相关联。此 API 允许应用响应用户在配对设备上执行的操作来启动 Activity。

  • 应用是在设备策略控制器模式下运行的设备拥有者。用例示例包括完全托管的企业设备以及专用设备(如数字标牌和信息亭)。

  • 应用已获得用户授予的SYSTEM_ALERT_WINDOW权限。

从 PendingIntents 启动 Activity 时需要选择加入

为了避免根据列出的条件意外启动 Activity,从 Android 14 开始,有一些显式 API 允许您选择加入或退出授予应用启动 Activity 的权限。

目标平台为 Android 15 或更高版本的应用将默认不再隐式授予其创建的PendingIntents后台 Activity 启动 (BAL) 权限。需要显式选择加入,为此,以下是根据应用是发送还是创建PendingIntents的不同选项。

Pending intents table
图 1:后台 Activity 启动的决策流程。

由 PendingIntent 的发送方决定

目标平台为 Android 14 或更高版本且想要启动PendingIntent的应用必须

  • 满足列出的条件并且
  • 选择加入以允许基于这些异常启动后台 Activity

此选择加入应在应用开发者知道该应用将启动 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()或类似方法。

阅读相关参考文档以获取更多详细信息