为了帮助开发者更有目的地定义面向用户的前台服务,Android 10 在 <service> 元素内引入了 android:foregroundServiceType 属性。
如果您的应用以 Android 14 为目标平台,则必须指定适当的前台服务类型。与以前的 Android 版本一样,可组合使用多个类型。下面列出了可供选择的前台服务类型:
cameraconnectedDevicedataSynchealthlocationmediaPlaybackmediaProjectionmicrophonephoneCallremoteMessagingshortServicespecialUsesystemExempted
如果应用中的用例与这些类型均不相关,强烈建议您迁移逻辑以使用 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 权限的跑步跟踪器服务。您需要在清单中同时声明 location 和 mediaPlayback。如果用户开始跑步,只希望跟踪其位置信息,您的应用应调用 startForeground(),并仅传递 location 服务类型。然后,如果用户想开始播放音频,请再次调用 startForeground() 并传递 location|mediaPlayback。
システムによるランタイム チェック
系统会检查前台服务类型的使用是否恰当,并确认应用是否已请求适当的运行时权限或使用所需的 API。例如,系统希望使用前台服务类型 FOREGROUND_SERVICE_TYPE_LOCATION 的应用请求 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION。
这意味着,在向用户请求权限和启动前台服务时,应用必须遵循非常具体的操作顺序。应用在尝试调用 startForeground() 之前,必须先请求并获得所需的权限。在启动前台服务后请求相应权限的应用必须更改此顺序,并在启动前台服务之前请求该权限。
本页面的每种前台服务类型的预期用例和强制执行部分中标记为“运行时要求”的部分列出了平台强制执行的具体内容。
各フォアグラウンド サービス タイプの対象ユースケースと適用
为了使用给定的前台服务类型,您必须在清单文件中声明特定权限,必须满足特定的运行时要求,并且应用必须满足该类型的其中一组预期用例。以下部分介绍了您必须声明的权限、运行时前提条件以及每种类型的预期用例。
カメラ
- 要在
android:foregroundServiceType下在清单中声明的前台服务类型 camera- 在清单中声明的权限
FOREGROUND_SERVICE_CAMERA- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_CAMERA- 运行时前提条件
请求并获得
CAMERA运行时权限注意:
CAMERA运行时权限受使用时限制的约束。因此,除少数例外情况外,您无法在应用在后台运行时创建camera前台服务。如需了解详情,请参阅与启动需要“使用时”权限的前台服务相关的限制。- 说明
继续在后台访问相机,例如支持多任务的视频聊天应用。
接続されたデバイス
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypeconnectedDevice- 在清单中声明的权限
FOREGROUND_SERVICE_CONNECTED_DEVICE- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE- 运行时前提条件
必须至少满足以下其中一个条件:
在清单中至少声明以下其中一项权限:
至少请求并被授予以下其中一项运行时权限:
- 说明
与需要蓝牙、NFC、IR、USB 或网络连接的外部设备进行互动。
- 替代方案
如果您的应用需要向外部设备持续传输数据,请考虑改用配套设备管理器。使用配套设备感知 API,可帮助您的应用在配套设备在范围内时保持运行。
如果您的应用需要扫描蓝牙设备,请考虑改用 Bluetooth Scan API。
データの同期
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypedataSync- 在清单中声明的权限
FOREGROUND_SERVICE_DATA_SYNC- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_DATA_SYNC- 运行时前提条件
- 无
- 说明
数据传输操作,例如:
- 数据上传或下载
- 备份和恢复操作
- 导入或导出操作
- 获取数据
- 本地文件处理
- 通过网络在设备和云端之间传输数据
- 替代方案
如需了解详情,请参阅数据同步前台服务的替代方案。
健康
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypehealth- 在清单中声明的权限
FOREGROUND_SERVICE_HEALTH- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_HEALTH- 运行时前提条件
必须至少满足以下其中一个条件:
在清单中声明
HIGH_SAMPLING_RATE_SENSORS权限。至少请求并被授予以下其中一项运行时权限:
- 在 API 级别 35 及更低级别上使用
BODY_SENSORS READ_HEART_RATEREAD_SKIN_TEMPERATUREREAD_OXYGEN_SATURATIONACTIVITY_RECOGNITION
- 在 API 级别 35 及更低级别上使用
注意:
BODY_SENSORS和基于传感器的读取运行时权限受“在使用时”限制。因此,除非您已获得BODY_SENSORS_BACKGROUND(API 级别 33 到 35)或READ_HEALTH_DATA_IN_BACKGROUND(API 级别 36 及更高级别)权限,否则您无法创建在应用处于后台运行时使用身体传感器的health前台服务。如需了解详情,请参阅与启动需要使用时权限的前台服务相关的限制。- 说明
为健身类别的应用(例如锻炼追踪器)提供支持的所有长时间运行的用例。
位置情報
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypelocation- 在清单中声明的权限
FOREGROUND_SERVICE_LOCATION- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_LOCATION- 运行时前提条件
用户必须已启用位置信息服务,并且应用必须至少获得以下一项运行时权限:
注意:如需检查用户是否已启用位置信息服务以及是否已授予对运行时权限的访问权限,请使用
PermissionChecker#checkSelfPermission()注意:位置信息运行时权限受“使用期间”限制。因此,除非您已获得
ACCESS_BACKGROUND_LOCATION运行时权限,否则无法在应用在后台运行时创建location前台服务。如需了解详情,请参阅与启动需要“使用时”权限的前台服务相关的限制。- 说明
需要位置信息使用权的长时间运行的用例,例如导航和位置信息分享。
- 替代方案
如果您的应用需要在用户到达特定位置时触发,请考虑改用 Geofence API。
メディア
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypemediaPlayback- 在清单中声明的权限
FOREGROUND_SERVICE_MEDIA_PLAYBACK- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK- 运行时前提条件
- 无
- 说明
- 在后台继续播放音频或视频。在 Android TV 上支持数字视频录制 (DVR) 功能。
- 替代方案
- 如果您要显示画中画视频,请使用画中画模式。
メディア プロジェクション
- マニフェストの
android:foregroundServiceTypemediaProjection- マニフェストで宣言する権限
FOREGROUND_SERVICE_MEDIA_PROJECTIONstartForeground()に渡す定数FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION- ランタイムの前提条件
フォアグラウンド サービスを開始する前に、
createScreenCaptureIntent()メソッドを呼び出します。これにより、ユーザーに権限通知が表示されます。サービスを作成するには、ユーザーが権限を付与する必要があります。フォアグラウンド サービスを作成したら、
MediaProjectionManager.getMediaProjection()を呼び出すことができます。- 説明
MediaProjectionAPI を使用して、プライマリ以外のディスプレイや外部デバイスにコンテンツを投影します。このコンテンツはメディア コンテンツ以外でもかまいませんが、- 代替
メディアを別のデバイスにストリーミングするには、Google Cast SDK を使用します。
マイク
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypemicrophone- 在清单中声明的权限
FOREGROUND_SERVICE_MICROPHONE- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_MICROPHONE- 运行时前提条件
请求并获得
RECORD_AUDIO运行时权限。注意:
RECORD_AUDIO运行时权限受使用时限制的约束。因此,除少数例外情况外,您无法在应用在后台运行时创建microphone前台服务。如需了解详情,请参阅与启动需要使用时权限的前台服务相关的限制。- 说明
在后台继续捕获麦克风内容,例如录音器或通信应用。
電話
- マニフェストで宣言するフォアグラウンド サービス タイプ
android:foregroundServiceTypephoneCall- マニフェストで宣言する権限
FOREGROUND_SERVICE_PHONE_CALLstartForeground()に渡す定数FOREGROUND_SERVICE_TYPE_PHONE_CALL- ランタイムの前提条件
次の条件の少なくとも 1 つを満たす必要があります。
- アプリがマニフェスト ファイルで
MANAGE_OWN_CALLS権限を宣言している。
- アプリがマニフェスト ファイルで
- アプリが
ROLE_DIALERロールを介してデフォルトのダイヤルアプリである。
- アプリが
- 説明
ConnectionServiceAPI を使用して、現在の呼び出しを続行します。- 代替
電話、ビデオ、VoIP 通話を行う必要がある場合は、
android.telecomライブラリの使用を検討してください。CallScreeningServiceを使用して通話をスクリーニングすることを検討してください。
リモート メッセージ
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTyperemoteMessaging- 在清单中声明的权限
FOREGROUND_SERVICE_REMOTE_MESSAGING- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING- 运行时前提条件
- 无
- 说明
- 将短信从一台设备转移到另一台设备。在用户切换设备时,帮助确保用户消息任务的连续性。
ショート サービス
- マニフェストで宣言するフォアグラウンド サービス タイプ
android:foregroundServiceTypeshortService- マニフェストで宣言する権限
- なし
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:foregroundServiceTypespecialUse- マニフェストで宣言する権限
FOREGROUND_SERVICE_SPECIAL_USEstartForeground()に渡す定数FOREGROUND_SERVICE_TYPE_SPECIAL_USE- ランタイムの前提条件
- なし
- 説明
他のフォアグラウンド サービス タイプでは対応できない有効なフォアグラウンド サービスのユースケースに対応します。
デベロッパーは、
FOREGROUND_SERVICE_TYPE_SPECIAL_USEフォアグラウンド サービス タイプを宣言することに加えて、マニフェストでユースケースを宣言する必要があります。そのためには、<service>要素内に<property>要素を指定します。これらの値とそれに対応するユースケースは Google Play Console でアプリを送信すると審査されます。用途 自由形式のケースなので、十分な量の情報を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:foregroundServiceTypesystemExempted- 在清单中声明的权限
FOREGROUND_SERVICE_SYSTEM_EXEMPTED- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED- 运行时前提条件
- 无
- 说明
为系统应用和特定系统集成预留,使其能继续使用前台服务。
如需使用此类型,应用必须至少满足以下条件之一:
- 设备处于演示模式状态
- 应用是设备所有者
- 应用是性能分析器所有者
- 属于具有
ROLE_EMERGENCY角色的安全应用 - 属于设备管理应用
- 具有
SCHEDULE_EXACT_ALARM或USE_EXACT_ALARM权限且使用前台服务在后台继续闹钟(包括仅振动闹钟)的应用。 VPN 应用(使用设置 > 网络和互联网 > VPN 进行配置)
否则,声明此类型会导致系统抛出
ForegroundServiceTypeNotAllowedException。
フォアグラウンド サービス タイプの使用に対する Google Play ポリシーの適用
Android 14 以降をターゲットとするアプリの場合は、Google Play Console の [アプリのコンテンツ] ページ([ポリシー] > [アプリのコンテンツ])で、アプリのフォアグラウンド サービスのタイプを申告する必要があります。Google Play Console でフォアグラウンド サービスのタイプを申告する方法について詳しくは、フォアグラウンド サービスと全画面インテントの要件についてをご覧ください。