Android 10(API 级别 29)及更高版本对应用在后台运行时可以启动 activity 的时间施加了限制。这些限制有助于最大限度地减少对用户造成的干扰,并且可以让用户更好地控制其屏幕上显示的内容。
本指南将介绍通知作为从后台启动 activity 的替代方案。该页面还列出了该限制不适用的具体情况。
改为显示通知
几乎在所有情况下,后台应用都必须显示具有时效性的通知以向用户提供紧急信息,而不是直接启动 activity。此类通知包括处理来电或有效的闹钟时钟。
这种基于通知的提醒和提醒系统可为用户提供以下几项优势:
- 使用设备时,用户会看到一条浮动通知,以便其做出响应。用户可以维护其当前上下文并控制他们在屏幕上看到的内容。
- 具有时效性的通知遵循用户的勿扰规则。例如,在“勿扰”模式下,用户可能会仅允许特定联系人或重复来电者的来电。
- 当设备屏幕关闭时,全屏 intent 会立即启动。
- 在设备的设置屏幕中,用户可以查看最近有哪些应用发送了通知,包括来自特定通知渠道的通知。在该屏幕中,用户可以控制其通知偏好设置。
应用何时可以启动 activity
当满足以下一个或多个条件时,在 Android 10 或更高版本上运行的应用可以启动 activity:
- 应用具有可见窗口,例如前台 Activity。
- 该应用在前台任务的返回堆栈中具有一个 activity。
应用在“最近使用的应用”屏幕上现有任务的返回堆栈中有一个 activity。
应用有一个最近启动的 activity。
应用对最近的一项 activity 调用了
finish()
。这仅适用于在调用finish()
时,应用在前台运行的 activity,或在前台任务的返回堆栈中具有 activity。该应用具有以下某个受系统绑定的服务。这些服务可能需要启动一个界面。
AccessibilityService
AutofillService
CallRedirectionService
HostApduService
InCallService
TileService
(不适用于 Android 14 [API 级别 34] 及更高版本)VoiceInteractionService
VrListenerService
。
该应用的一项服务被另一个可见的应用绑定。绑定到该服务的应用必须保持可见,以便在后台的应用成功启动 activity。
应用会从系统收到通知
PendingIntent
。对于服务和广播接收器的待处理 intent,应用可以在待处理 intent 发送几秒钟后启动 activity。应用会收到来自其他可见应用发送的
PendingIntent
。应用收到一条系统广播,在该广播中,应用应启动界面。例如
ACTION_NEW_OUTGOING_CALL
和SECRET_CODE_ACTION
。应用可在广播发送几秒钟后启动 Activity。应用通过
CompanionDeviceManager
API 与配套硬件设备相关联。此 API 可让应用启动 activity 以响应用户在配对设备上执行的操作。应用被用户授予
SYSTEM_ALERT_WINDOW
权限。
从 PendingIntent 启动 activity 时需要选择启用界面
为了避免基于所列条件的意外 activity 启动,从 Android 14 开始,我们提供了明确的 API,可让您选择启用或停用向应用授予 activity 启动权限。
以 Android 15 或更高版本为目标平台的应用将默认不再向其创建的 PendingIntents
隐式授予后台 activity 启动权限。必须明确选择启用,为此,这些选项取决于应用是在发送还是要创建 PendingIntents
。
由 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()
或类似方法。
如需了解详情,请阅读相关参考文档:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode