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 启动 (BAL) 权限。需要明确选择启用,为此,请根据应用是发送还是创建 PendingIntents
,选择以下选项。
由 PendingIntent 的发送者
以 Android 14 或更高版本为目标平台且想要启动 PendingIntent
的应用必须
- 满足列出的条件 ,并且
- 选择启用,以允许根据这些例外情况启动后台 activity
只有当应用开发者知道应用将要启动 Activity 时,才应选择启用此功能。
如需选择启用,应用应通过 setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
将 ActivityOptions
软件包传递给 PendingIntent.send()
或类似方法。
由 PendingIntent 的创建者
如果以 Android 15 或更高版本为目标平台的应用创建了 PendingIntent
,则现在必须明确选择启用,才能允许在所列条件下启动这些 PendingIntents
。
在大多数情况下,启动 PendingIntent
的应用应选择启用该功能。
不过,如果创建应用需要授予这些权限,则:
- 只要创建应用可见,
PendingIntent
就可以随时启动。 - 如果创建应用具有特殊权限,则可以随时启动
PendingIntent
。
如需选择启用,应用应通过 setPendingIntentCreatorBackgroundActivityStartMode
(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
将 ActivityOptions
软件包传递给 PendingIntent.getActivity()
或类似方法。
如需了解详情,请参阅相关参考文档:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
严格模式
从 Android 16 开始,应用开发者可以启用严格模式,以便在 activity 启动被阻止时(或在应用的目标 SDK 提高时有被阻止的风险时)收到通知。
以下示例代码展示了如何在 Application、Activity 或其他应用组件的 Application.onCreate()
方法中尽早启用该功能:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectBlockedBackgroundActivityLaunch()
.penaltyLog()
.build());
)
}
如需了解详情,请参阅严格模式文档。