以 Android 12(API 级别 31)或更高版本为目标平台的应用无法在后台运行时启动前台
服务,少数特殊
情况除外。如果应用在后台运行时尝试启动
前台服务,并且前台
服务不符合任何特殊情况,则系统会抛出
ForegroundServiceStartNotAllowedException。
此外,如果应用想要启动需要 “使用时”权限(例如,身体传感器、摄像头、麦克风或 位置信息 权限)的前台服务,即使该应用属于后台启动 限制的豁免情况之一,也无法在应用处于后台时创建该服务。如需了解原因,请参阅对启动需要“使用时” 权限的前台服务的限制 部分。
后台启动限制的豁免情况
在以下情况下,即使您的应用在后台运行,也可以启动前台服务:
- 您的应用从用户可见的某种状态(如 activity)过渡。
- 您的应用可以从后台启动 activity,但该应用在现有任务的返回堆栈中具有 activity 的情况除外。
您的应用使用 Firebase Cloud Messaging 接收高优先级消息。
您的应用调用精确闹钟来 完成用户请求的操作。
您的应用是设备的当前输入法。
设备重新启动并在广播接收器中接收
ACTION_BOOT_COMPLETED、ACTION_LOCKED_BOOT_COMPLETED、 或ACTION_MY_PACKAGE_REPLACEDintent 操作之后。您的应用在广播接收器中接收
ACTION_TIMEZONE_CHANGED、ACTION_TIME_CHANGED、 或ACTION_LOCALE_CHANGEDintent 操作。您的应用从
NfcService接收ACTION_TRANSACTION_DETECTED事件。您的应用使用配套设备管理器,并声明
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND权限或REQUEST_COMPANION_RUN_IN_BACKGROUND权限。请尽可能使用REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND。用户关闭了针对您的应用的电池优化功能。
您的应用拥有
SYSTEM_ALERT_WINDOW权限。 注意:如果您的应用以 Android 15 或更高版本为目标平台,则必须拥有SYSTEM_ALERT_WINDOW权限,并且应用当前必须具有可见的叠加层窗口。
对启动需要“使用时”权限的前台服务的限制
在 Android 14(API 级别 34)或更高版本中,如果您要启动需要“使用时”权限的前台服务,则需要注意一些特殊情况。
如果您的应用以 Android 14 或更高版本为目标平台,操作系统会在您创建前台服务时进行检查,以确保您的应用拥有该服务类型的所有相应权限。例如,当您创建麦克风类型的前台服务时,操作系统会验证您的应用当前是否拥有
RECORD_AUDIO
权限。如果您没有该权限,系统会抛出
SecurityException。
对于“使用时”权限,这可能会导致问题。如果您的应用拥有
“使用时”权限,则只有在应用处于
前台时,它才拥有该权限。这意味着,如果您的应用处于后台,并且尝试创建摄像头、位置信息或麦克风类型的前台服务,系统会看到您的应用当前没有所需的权限,并抛出
SecurityException。
同样,如果您的应用处于后台并创建需要 BODY_SENSORS 权限的健康服务,则该应用当前没有该权限,并且系统会抛出异常。
(如果健康服务需要不同的权限,
例如 ACTIVITY_RECOGNITION,则不适用此情况。)调用
PermissionChecker.checkSelfPermission()
不会阻止此问题。如果您的应用拥有“使用时”权限,并且调用 checkSelfPermission()
来检查它是否拥有该权限,即使应用处于后台,该方法也会返回 PERMISSION_GRANTED。当该方法返回
PERMISSION_GRANTED 时,它表示“您的应用在使用时拥有此权限”。
因此,如果您的前台服务需要“使用时”权限,您
必须在Context.startForegroundService()或Context.bindService()时调用
您的应用具有可见 activity,除非该服务属于
定义的豁免情况之一。
“使用时”权限限制的豁免情况
在某些情况下,即使前台服务是在应用 在后台运行时启动的,它仍然可以在应用在前台运行时 (“使用时”)访问位置信息、 摄像头和麦克风信息。
在这些相同的情况下,如果服务声明的前台服务
类型为 location 并且由具有 ACCESS_BACKGROUND_LOCATION
权限的应用启动,则该服务可以始终访问位置信息,即使
应用在后台运行时也是如此。
以下列表包含这些情况:
- 系统组件启动该服务。
- 该服务通过与应用 微件进行交互启动。
- 该服务通过与通知进行交互启动。
- 该服务作为从其他可见应用发送的
PendingIntent启动。 - 该服务由在设备所有者模式下运行的设备政策 控制器应用启动。
- 该服务由提供
VoiceInteractionService的应用启动。 - 该服务由具有
START_ACTIVITIES_FROM_BACKGROUND特权的应用启动。
确定应用中的哪些服务受到影响
测试您的应用时,请启动其前台服务。如果启动的服务对位置信息、麦克风和摄像头的访问受到限制,Logcat 中就会显示以下消息:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME