フォアグラウンド サービス タイプは必須

デベロッパーがユーザー向けのフォアグラウンド サービスをより意識的に定義できるように、Android 10 で <service> 要素内に android:foregroundServiceType 属性が導入されました。

Android 14 をターゲットとするアプリでは、適切なフォアグラウンド サービス タイプを指定する必要があります。以前のバージョンの Android と同様に、複数のタイプを組み合わせることができます。以下に、選択可能なフォアグラウンド サービス タイプのリストを示します。

アプリのユースケースがこれらのタイプのいずれにも関連していない場合は、WorkManager またはユーザーが開始するデータ転送ジョブを使用するようにロジックを移行することを強くおすすめします。

Android 14 では、health, remoteMessaging, shortService, specialUse 型と systemExempted 型が新たに導入されています。

次のコード スニペットは、マニフェストでのフォアグラウンド サービス タイプの宣言の例を示しています。

<manifest ...>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
    <application ...>
      <service
          android:name=".MyMediaPlaybackService"
          android:foregroundServiceType="mediaPlayback"
          android:exported="false">
      </service>
    </application>
</manifest>

Android 14 をターゲットとするアプリがマニフェストで特定のサービスタイプを定義していない場合、そのサービスの startForeground() を呼び出した際に MissingForegroundServiceTypeException が発生します。

フォアグラウンド サービス タイプを使用する新しい権限を宣言する

如果以 Android 14 为目标平台的应用使用前台服务,则必须根据前台服务类型声明 Android 14 中引入的特定权限。这些权限显示在本页每种前台服务类型的预期用例和强制执行部分中标记为“您必须在清单文件中声明的权限”的部分。

所有这些权限都定义为一般权限,并默认授予。用户无法撤消这些权限。

実行時にフォアグラウンド サービス タイプを含める

对于启动前台服务的应用,最佳实践是使用 startForeground()ServiceCompat 版本(在 androidx-core 1.12 及更高版本中提供),并在其中传入前台服务类型的按位整数。您可以选择传递一个或多个类型值。

通常,您应仅声明特定用例所需的类型。这样可以更轻松地满足系统对每种前台服务类型的预期。如果某项前台服务以多种类型启动,则该前台服务必须遵守所有类型的平台强制执行要求

ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)

如果在调用中未指定前台服务类型,则类型默认为清单中定义的值。如果您未在清单中指定服务类型,系统会抛出 MissingForegroundServiceTypeException

如果前台服务在启动后需要新权限,您应再次调用 startForeground() 并添加新的服务类型。例如,假设一款健身应用运行一项始终需要 location 信息但可能不需要 media 权限的跑步跟踪器服务。您需要在清单中同时声明 locationmediaPlayback。如果用户开始跑步,只希望跟踪其位置信息,您的应用应调用 startForeground(),并仅传递 location 服务类型。然后,如果用户想开始播放音频,请再次调用 startForeground() 并传递 location|mediaPlayback

システムによるランタイム チェック

系统会检查前台服务类型的使用是否恰当,并确认应用是否已请求适当的运行时权限或使用所需的 API。例如,系统希望使用前台服务类型 FOREGROUND_SERVICE_TYPE_LOCATION 的应用请求 ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION

这意味着,在向用户请求权限和启动前台服务时,应用必须遵循非常具体的操作顺序。应用在尝试调用 startForeground() 之前,必须先请求并获得所需的权限。在启动前台服务后请求相应权限的应用必须更改此顺序,并在启动前台服务之前请求该权限。

本页面的每种前台服务类型的预期用例和强制执行部分中标记为“运行时要求”的部分列出了平台强制执行的具体内容。

各フォアグラウンド サービス タイプの対象ユースケースと適用

为了使用给定的前台服务类型,您必须在清单文件中声明特定权限,必须满足特定的运行时要求,并且应用必须满足该类型的其中一组预期用例。以下部分介绍了您必须声明的权限、运行时前提条件以及每种类型的预期用例。

カメラ

要在 android:foregroundServiceType 下在清单中声明的前台服务类型
camera
在清单中声明的权限
FOREGROUND_SERVICE_CAMERA
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_CAMERA
运行时前提条件

请求并获得 CAMERA 运行时权限

注意CAMERA 运行时权限受使用时限制的约束。因此,除少数例外情况外,您无法在应用在后台运行时创建 camera 前台服务。如需了解详情,请参阅与启动需要“使用时”权限的前台服务相关的限制

说明

继续在后台访问相机,例如支持多任务的视频聊天应用。

接続されたデバイス

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
connectedDevice
在清单中声明的权限
FOREGROUND_SERVICE_CONNECTED_DEVICE
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
运行时前提条件

必须至少满足以下其中一个条件:

说明

与需要蓝牙、NFC、IR、USB 或网络连接的外部设备进行互动。

替代方案

如果您的应用需要向外部设备持续传输数据,请考虑改用配套设备管理器。使用配套设备感知 API,可帮助您的应用在配套设备在范围内时保持运行。

如果您的应用需要扫描蓝牙设备,请考虑改用 Bluetooth Scan API

データの同期

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
dataSync
在清单中声明的权限
FOREGROUND_SERVICE_DATA_SYNC
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_DATA_SYNC
运行时前提条件
说明

数据传输操作,例如:

  • 数据上传或下载
  • 备份和恢复操作
  • 导入或导出操作
  • 获取数据
  • 本地文件处理
  • 通过网络在设备和云端之间传输数据
替代方案

如需了解详情,请参阅数据同步前台服务的替代方案

健康

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
health
在清单中声明的权限
FOREGROUND_SERVICE_HEALTH
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_HEALTH
运行时前提条件

必须至少满足以下其中一个条件:

注意BODY_SENSORS 和基于传感器的读取运行时权限受“在使用时”限制。因此,除非您已获得 BODY_SENSORS_BACKGROUND(API 级别 33 到 35)或 READ_HEALTH_DATA_IN_BACKGROUND(API 级别 36 及更高级别)权限,否则您无法创建在应用处于后台运行时使用身体传感器的 health 前台服务。如需了解详情,请参阅与启动需要使用时权限的前台服务相关的限制

说明

为健身类别的应用(例如锻炼追踪器)提供支持的所有长时间运行的用例。

位置情報

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
location
在清单中声明的权限
FOREGROUND_SERVICE_LOCATION
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_LOCATION
运行时前提条件

用户必须已启用位置信息服务,并且应用必须至少获得以下一项运行时权限:

注意:如需检查用户是否已启用位置信息服务以及是否已授予对运行时权限的访问权限,请使用 PermissionChecker#checkSelfPermission()

注意:位置信息运行时权限受“使用期间”限制。因此,除非您已获得 ACCESS_BACKGROUND_LOCATION 运行时权限,否则无法在应用在后台运行时创建 location 前台服务。如需了解详情,请参阅与启动需要“使用时”权限的前台服务相关的限制

说明

需要位置信息使用权的长时间运行的用例,例如导航和位置信息分享。

替代方案

如果您的应用需要在用户到达特定位置时触发,请考虑改用 Geofence API

メディア

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
mediaPlayback
在清单中声明的权限
FOREGROUND_SERVICE_MEDIA_PLAYBACK
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
运行时前提条件
说明
在后台继续播放音频或视频。在 Android TV 上支持数字视频录制 (DVR) 功能。
替代方案
如果您要显示画中画视频,请使用画中画模式

メディア プロジェクション

マニフェストの
android:foregroundServiceType
mediaProjection
マニフェストで宣言する権限
FOREGROUND_SERVICE_MEDIA_PROJECTION
startForeground() に渡す定数
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
ランタイムの前提条件

フォアグラウンド サービスを開始する前に、createScreenCaptureIntent() メソッドを呼び出します。これにより、ユーザーに権限通知が表示されます。サービスを作成するには、ユーザーが権限を付与する必要があります。

フォアグラウンド サービスを作成したら、MediaProjectionManager.getMediaProjection() を呼び出すことができます。

説明

MediaProjection API を使用して、プライマリ以外のディスプレイや外部デバイスにコンテンツを投影します。このコンテンツはメディア コンテンツ以外でもかまいませんが、

代替

メディアを別のデバイスにストリーミングするには、Google Cast SDK を使用します。

マイク

マニフェストの
android:foregroundServiceType
microphone
マニフェストで宣言する権限
FOREGROUND_SERVICE_MICROPHONE
startForeground() に渡す定数
FOREGROUND_SERVICE_TYPE_MICROPHONE
ランタイムの前提条件

RECORD_AUDIO の実行時の権限をリクエストして付与される。

注: RECORD_AUDIO 実行時の権限には、使用中の制限が適用されます。そのため、少数の例外を除き、アプリがバックグラウンドにあるときに microphone フォアグラウンド サービスを作成することはできません。詳細については、使用中の権限が必要なフォアグラウンド サービスの開始に関する制限をご覧ください。

説明

ボイス レコーダーや通信アプリなど、バックグラウンドからマイクのキャプチャを続行します。

電話

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
phoneCall
在清单中声明的权限
FOREGROUND_SERVICE_PHONE_CALL
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_PHONE_CALL
运行时前提条件

必须至少满足以下其中一个条件:

  • 应用是通过 ROLE_DIALER 角色的默认拨号器应用。
说明

使用 ConnectionService API 继续当前通话。

替代方案

如果您需要拨打电话、视频通话或 VoIP 通话,不妨考虑使用 android.telecom 库。

考虑使用 CallScreeningService 来过滤来电。

リモート メッセージ

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
remoteMessaging
在清单中声明的权限
FOREGROUND_SERVICE_REMOTE_MESSAGING
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
运行时前提条件
说明
将短信从一台设备转移到另一台设备。在用户切换设备时,帮助确保用户消息任务的连续性。

ショート サービス

マニフェストで宣言するフォアグラウンド サービス タイプ
android:foregroundServiceType
shortService
マニフェストで宣言する権限
なし
startForeground() に渡す定数
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
ランタイムの前提条件
なし
説明

中断や延期ができない重要な作業を迅速に終了します。

このタイプには、以下のような特徴があります。

  • 短時間(約 3 分)しか実行できない。
  • スティッキー フォアグラウンド サービスをサポートしていない。
  • 他のフォアグラウンド サービスを開始できない。
  • タイプ固有の権限は不要だが、FOREGROUND_SERVICE 権限は必要。
  • shortService を別のサービス タイプに変更できるのは、アプリが現在新しいフォアグラウンド サービスを開始できる場合のみです。
  • フォアグラウンド サービスは、いつでもタイプを shortService に変更できます。この時点でタイムアウト期間が開始されます。

shortService のタイムアウトは、Service.startForeground() が呼び出された時点から始まります。アプリは、タイムアウトが発生する前に Service.stopSelf() または Service.stopForeground() を呼び出すことが想定されています。それ以外の場合は、新しい Service.onTimeout() が呼び出されます。これにより、アプリは短い期間、stopSelf() または stopForeground() を呼び出してサービスを停止できます。

Service.onTimeout() が呼び出されてからしばらくすると、アプリはキャッシュに保存された状態になり、ユーザーがアプリを操作している場合を除き、フォアグラウンドにないと見なされるようになります。アプリがキャッシュに保存されてからしばらくして、サービスが停止していない場合、アプリで ANR が発生します。ANR メッセージには、FOREGROUND_SERVICE_TYPE_SHORT_SERVICE と記載されます。このような理由から、Service.onTimeout() コールバックを実装することをおすすめします。

Android 13 以前では Service.onTimeout() コールバックは存在しません。このようなデバイスで同じサービスが実行されている場合、タイムアウトも ANR も発生しません。Service.onTimeout() コールバックを受け取っていなくても、処理タスクが完了したらすぐにサービスが停止するようにしてください。

shortService のタイムアウトを尊重しない場合、他の有効なフォアグラウンド サービスや、他のアプリ ライフサイクル プロセスが実行されていても、アプリで ANR が発生することに注意してください。

アプリがユーザーに表示されている場合、または、バックグラウンドからのフォアグラウンド サービスの開始を許可する除外の条件の一つを満たす場合、もう一度 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE が呼び出され、Service.StartForeground() のパラメータによってタイムアウトがさらに 3 分延長されます。アプリがユーザーに表示されておらず、除外の条件の一つを満たしていない場合、別のフォアグラウンド サービスを起動しようとすると、タイプに関係なく ForegroundServiceStartNotAllowedException が発生します。

ユーザーがアプリのバッテリーの最適化を無効にしていても、shortService FGS のタイムアウトの影響を受けます。

shortService タイプと別のフォアグラウンド サービス タイプを含むフォアグラウンド サービスを開始する場合、システムは shortService タイプの宣言を無視します。ただし、サービスは引き続き、他の宣言されたタイプの前提条件に準拠する必要があります。詳細については、フォアグラウンド サービスのドキュメントをご覧ください。

特殊用途

要在清单中声明的前台服务类型
android:foregroundServiceType
specialUse
在清单中声明的权限
FOREGROUND_SERVICE_SPECIAL_USE
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
运行时前提条件
说明

涵盖其他前台服务类型未涵盖的所有有效前台服务用例。

除了声明 FOREGROUND_SERVICE_TYPE_SPECIAL_USE 前台服务类型之外,开发者还应在清单中声明用例。为此,他们会在 <service> 元素内指定 <property> 元素。这些值和相应的应用场景 。用途 您提供的案例均为自由形式,因此,您应确保提供足够的 相关信息,让审核人员了解您为何需要使用 specialUse 类型。

<service android:name="fooService" android:foregroundServiceType="specialUse">
  <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
      android:value="explanation_for_special_use"/>
</service>

除外されたシステム

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
systemExempted
在清单中声明的权限
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
运行时前提条件
说明

为系统应用和特定系统集成预留,使其能继续使用前台服务。

如需使用此类型,应用必须至少满足以下条件之一:

フォアグラウンド サービス タイプの使用に対する Google Play ポリシーの適用

如果您的应用以 Android 14 或更高版本为目标平台,您需要在 Play 管理中心的“应用内容”页面(政策 > 应用内容)中声明应用的前台服务类型。如需详细了解如何在 Play 管理中心内声明前台服务类型,请参阅了解前台服务和全屏 intent 要求