Android 10 (API 级别 29) 及更高版本对后台应用可启动 Activity 的时间施加限制。这些限制有助于最大限度地减少对用户造成的中断,并且可以让用户更好地控制其屏幕上显示的内容。
注意:为启动 Activity,系统仍会将运行前台服务的应用视为“后台”应用。
本指南将通知作为从后台启动 Activity 的备选方案进行说明。随后,本指南将列举不适用于此类限制的个别情况。
改为显示通知
几乎在所有情况下,后台应用都应显示有时效性的通知,以便向用户提供紧急信息,而非直接启动 Activity。此类通知的适用情形包括处理来电或正在响铃的闹钟。
这种基于通知的提醒系统可为用户提供以下若干优势:
- 当用户使用设备时,系统会显示浮动通知,以便用户作出响应。用户可以维护其当前上下文,并控制自己在屏幕上看到的内容。
- 有时效性的通知遵循用户的请勿打扰规则。例如,启用“请勿打扰”功能后,用户可以仅允许特定联系人或重复来电者的来电。
- 设备屏幕关闭时,您的全屏 intent 会立即启动。
- 在设备的 Settings 屏幕中,用户可以查看哪些应用最近发送了通知(包括来自特定通知渠道的通知)。在该屏幕中,用户可以控制其通知偏好设置。
限制的例外情况
在 Android 10 或更高版本上运行的应用只有在满足以下一项或多项条件时,才能启动 Activity:
- 应用具有可见窗口,例如前台 Activity。
- 应用在前台任务的返回栈中拥有 Activity。
-
应用在 Recents 屏幕上现有任务的返回栈中拥有 Activity。
注意:当此类应用尝试启动新的 Activity 时,系统会将该 Activity 放置到应用现有任务的顶部,但不会离开当前可见的任务。当用户稍后返回应用任务时,系统会启动新的 Activity,而不是之前放置在应用任务顶部的 Activity。
-
应用的某个 Activity 刚在不久前启动。
-
应用最近为某个 Activity 调用了 finish()。这仅适用于在调用
finish()
时,应用在前台或前台任务的返回栈中拥有 Activity 的情况。 -
应用具有受系统约束的服务。此情况仅适用于以下服务,这些服务可能需要启动界面:AccessibilityService、AutofillService、CallRedirectionService、HostApduService、InCallService、TileService、VoiceInteractionService 和 VrListenerService。
-
应用中的某个服务受另一个可见应用约束。请注意,绑定到服务的应用必须保持可见,以便后台应用成功启动 Activity。
-
应用收到系统的 PendingIntent 通知。对于服务和广播接收器的挂起 Intent,应用可在该挂起 Intent 发送几秒钟后启动 Activity。
-
应用收到另一个可见应用发送的 PendingIntent。
-
应用收到它应该在其中启动界面的系统广播。示例包括 ACTION_NEW_OUTGOING_CALL 和 SECRET_CODE_ACTION。应用可在广播发送几秒钟后启动 Activity。
-
应用通过 CompanionDeviceManager API 与配套硬件设备相关联。此 API 支持应用启动 API,以响应用户在配对设备上执行的操作。
-
用户已向应用授予 SYSTEM_ALERT_WINDOW 权限。
注意:在 Android 10(Go 版本)上运行的应用无法获得 SYSTEM_ALERT_WINDOW 权限。