Bắt buộc phải có loại dịch vụ trên nền trước

To help developers be more intentional with defining user-facing foreground services, Android 10 introduced the android:foregroundServiceType attribute within the <service> element.

If your app targets Android 14, it must specify appropriate foreground service types. As in previous versions of Android, multiple types can be combined. This list shows the foreground service types to choose from:

If a use case in your app isn't associated with any of these types, we strongly recommend that you migrate your logic to use WorkManager or user-initiated data transfer jobs.

The health, remoteMessaging, shortService, specialUse, and systemExempted types are new in Android 14.

The following code snippet provides an example of a foreground service type declaration in the manifest:

<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>

If an app that targets Android 14 doesn't define types for a given service in the manifest, then the system will raise MissingForegroundServiceTypeException upon calling startForeground() for that service.

Khai báo quyền mới để sử dụng các loại dịch vụ trên nền trước

If apps that target Android 14 use a foreground service, they must declare a specific permission, based on the foreground service type, that Android 14 introduces. These permissions appear in the sections labeled "permission that you must declare in your manifest file" in the intended use cases and enforcement for each foreground service type section on this page.

All of the permissions are defined as normal permissions and are granted by default. Users cannot revoke these permissions.

Cung cấp loại dịch vụ trên nền trước trong thời gian chạy

Phương pháp hay nhất cho các ứng dụng có bắt đầu dịch vụ trên nền trước là sử dụng phiên bản ServiceCompat của startForeground() (có trong androidx-core 1.12 trở lên), trong đó bạn truyền một số nguyên bitwise của các kiểu dịch vụ trên nền trước. Bạn có thể chọn truyền một hoặc nhiều giá trị tương ứng với từng kiểu.

Thường thì bạn chỉ nên khai báo các kiểu cần thiết cho một trường hợp sử dụng cụ thể. Điều này giúp bạn dễ dàng đáp ứng các kỳ vọng của hệ thống đối với từng loại dịch vụ trên nền trước. Trong trường hợp sử dụng nhiều kiểu để bắt đầu dịch vụ trên nền trước, thì dịch vụ trên nền trước đó phải tuân thủ các yêu cầu thực thi trên nền tảng của tất cả kiểu.

ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)

Nếu kiểu dịch vụ trên nền trước không được chỉ định trong lệnh gọi, thì kiểu này sẽ mặc định là các giá trị được xác định trong tệp kê khai. Nếu bạn không chỉ định loại dịch vụ trong tệp kê khai, hệ thống sẽ gửi MissingForegroundServiceTypeException.

Nếu dịch vụ trên nền trước cần các quyền mới sau khi bạn khởi chạy, bạn nên gọi lại startForeground() và thêm các loại dịch vụ mới. Ví dụ: giả sử một ứng dụng thể dục chạy một dịch vụ theo dõi chạy bộ luôn cần thông tin location, nhưng có thể cần hoặc không cần quyền media. Bạn cần khai báo cả locationmediaPlayback trong tệp kê khai. Nếu người dùng bắt đầu chạy và chỉ muốn theo dõi vị trí của họ, thì ứng dụng của bạn sẽ gọi startForeground() và chỉ truyền loại dịch vụ location. Sau đó, nếu người dùng muốn bắt đầu phát âm thanh, hãy gọi lại startForeground() và truyền location|mediaPlayback.

Kiểm tra thời gian chạy của hệ thống

Hệ thống kiểm tra việc sử dụng đúng cách các loại dịch vụ trên nền trước và xác nhận rằng ứng dụng đã yêu cầu quyền thời gian chạy thích hợp hoặc sử dụng API đúng yêu cầu. Ví dụ: hệ thống yêu cầu các ứng dụng dùng loại dịch vụ trên nền trước FOREGROUND_SERVICE_TYPE_LOCATION để yêu cầu ACCESS_COARSE_LOCATION hoặc ACCESS_FINE_LOCATION.

Tức là ứng dụng phải tuân theo một thứ tự hoạt động rất cụ thể khi yêu cầu người dùng cấp quyền và bắt đầu các dịch vụ trên nền trước. Các quyền phải được yêu cầu và được cấp trước khi ứng dụng cố gắng gọi startForeground(). Các ứng dụng yêu cầu quyền thích hợp sau khi bắt đầu dịch vụ trên nền trước phải thay đổi thứ tự hoạt động này và yêu cầu quyền trước khi bắt đầu dịch vụ trên nền trước.

Thông tin cụ thể về việc thực thi của nền tảng sẽ xuất hiện trong các phần có nhãn "yêu cầu về thời gian chạy" trong phần Các trường hợp sử dụng dự kiến và việc thực thi từng loại dịch vụ trên nền trước trên trang này.

Trường hợp sử dụng dự kiến và biện pháp thực thi đối với từng loại dịch vụ trên nền trước

Để sử dụng một kiểu dịch vụ trên nền trước nhất định, bạn phải khai báo một quyền cụ thể trong tệp kê khai, bạn phải đáp ứng các yêu cầu cụ thể về thời gian chạy, cũng như ứng dụng của bạn phải đáp ứng một trong các nhóm trường hợp sử dụng dự kiến cho kiểu đó. Các phần sau giải thích quyền bạn phải khai báo, các điều kiện tiên quyết về thời gian chạy và các trường hợp sử dụng dự kiến của từng kiểu.

Máy ảnh

Foreground service type to declare in manifest under android:foregroundServiceType
camera
Permission to declare in your manifest
FOREGROUND_SERVICE_CAMERA
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_CAMERA
Runtime prerequisites

Request and be granted the CAMERA runtime permission

Note: The CAMERA runtime permission is subject to while-in-use restrictions. For this reason, you cannot create a camera foreground service while your app is in the background, with a few exceptions. For more information, see Restrictions on starting foreground services that need while-in-use permissions.

Description

Continue to access the camera from the background, such as video chat apps that allow for multitasking.

Thiết bị đã kết nối

Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceType
connectedDevice
Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_CONNECTED_DEVICE
Hằng số để truyền đến startForeground()
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
Điều kiện tiên quyết về thời gian chạy

Ít nhất một trong các điều kiện sau phải đúng:

Nội dung mô tả

Các hoạt động tương tác với thiết bị bên ngoài cần có kết nối Bluetooth, NFC, IR, USB hoặc kết nối mạng.

Lựa chọn thay thế

Nếu ứng dụng của bạn cần chuyển dữ liệu liên tục sang một thiết bị bên ngoài, hãy cân nhắc sử dụng trình quản lý thiết bị đồng hành. Sử dụng API hiện diện của thiết bị đồng hành để giúp ứng dụng của bạn luôn chạy trong khi thiết bị đồng hành ở trong phạm vi.

Nếu ứng dụng của bạn cần quét tìm thiết bị Bluetooth, hãy cân nhắc sử dụng API quét Bluetooth.

Đồng bộ hoá dữ liệu

Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceType
dataSync
Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_DATA_SYNC
Hằng số để truyền đến startForeground()
FOREGROUND_SERVICE_TYPE_DATA_SYNC
Điều kiện tiên quyết về thời gian chạy
Không có
Nội dung mô tả

Các hoạt động chuyển dữ liệu, chẳng hạn như:

  • Tải dữ liệu lên hoặc tải dữ liệu xuống
  • Hoạt động sao lưu và khôi phục
  • Hoạt động nhập hoặc xuất dữ liệu
  • Tìm nạp dữ liệu
  • Xử lý tệp cục bộ
  • Chuyển dữ liệu giữa thiết bị và đám mây qua mạng
Lựa chọn thay thế

Hãy xem phần Các giải pháp thay thế cho dịch vụ đồng bộ hoá dữ liệu trên nền trước để biết thông tin chi tiết.

Sức khoẻ

Foreground service type to declare in manifest under
android:foregroundServiceType
health
Permission to declare in your manifest
FOREGROUND_SERVICE_HEALTH
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
Runtime prerequisites

At least one of the following conditions must be true:

Note: The BODY_SENSORS and sensor-based READ runtime permissions are subject to while-in-use restrictions. For this reason, you cannot create a health foreground service that uses body sensors while your app is in the background unless you've been granted the BODY_SENSORS_BACKGROUND (API level 33 to 35) or READ_HEALTH_DATA_IN_BACKGROUND (API level 36 and higher) permissions. For more information, see Restrictions on starting foreground services that need while-in-use permissions.

Description

Any long-running use cases to support apps in the fitness category such as exercise trackers.

Vị trí

Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceType
location
Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_LOCATION
Hằng số để truyền đến startForeground()
FOREGROUND_SERVICE_TYPE_LOCATION
Điều kiện tiên quyết về thời gian chạy

Người dùng phải bật dịch vụ vị trí và ứng dụng phải được cấp ít nhất một trong các quyền khi bắt đầu chạy sau đây:

Lưu ý: Để kiểm tra xem người dùng đã bật dịch vụ vị trí cũng như cấp quyền truy cập vào các quyền khi bắt đầu chạy hay chưa, hãy sử dụng PermissionChecker#checkSelfPermission()

Lưu ý: Quyền khi bắt đầu chạy liên quan đến vị trí phải tuân theo các quy định hạn chế khi đang sử dụng. Vì lý do này, bạn không thể tạo dịch vụ trên nền trước location khi ứng dụng đang chạy ở chế độ nền, trừ phi bạn đã được cấp quyền thời gian chạy ACCESS_BACKGROUND_LOCATION. Để biết thêm thông tin, hãy xem phần Hạn chế khi khởi động các dịch vụ trên nền trước cần quyền khi đang sử dụng.

Mô tả

Các trường hợp sử dụng lâu dài (ví dụ: chỉ đường và chia sẻ vị trí) cần đến quyền truy cập thông tin vị trí.

Lựa chọn thay thế

Nếu ứng dụng của bạn cần được kích hoạt khi người dùng đến một số vị trí cụ thể, hãy cân nhắc sử dụng API khoanh vùng địa lý.

Nội dung nghe nhìn

Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceType
mediaPlayback
Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_MEDIA_PLAYBACK
Hằng số để truyền đến startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
Điều kiện tiên quyết về thời gian chạy
Không có
Nội dung mô tả
Tiếp tục phát âm thanh hoặc video ở chế độ nền. Hỗ trợ chức năng Quay video kỹ thuật số (DVR) trên Android TV.
Lựa chọn thay thế
Nếu bạn đang hiển thị video hình trong hình, hãy sử dụng chế độ Hình trong hình.

Chiếu nội dung nghe nhìn

Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceType
mediaProjection
Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_MEDIA_PROJECTION
Hằng số để truyền đến startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
Điều kiện tiên quyết về thời gian chạy

Gọi phương thức createScreenCaptureIntent() trước khi bắt đầu dịch vụ trên nền trước. Thao tác này sẽ hiển thị thông báo cấp quyền cho người dùng; người dùng phải cấp quyền thì bạn mới có thể tạo dịch vụ.

Sau khi tạo dịch vụ trên nền trước, bạn có thể gọi MediaProjectionManager.getMediaProjection().

Mô tả

Chiếu nội dung tới màn hình phụ hoặc thiết bị bên ngoài bằng các API MediaProjection. Nội dung này không nhất thiết chỉ là nội dung đa phương tiện.

Lựa chọn thay thế

Để truyền trực tuyến nội dung nghe nhìn sang một thiết bị khác, hãy sử dụng SDK Google Cast.

Micrô

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

请求并获得 RECORD_AUDIO 运行时权限。

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

说明

在后台继续捕获麦克风内容,例如录音器或通信应用。

Cuộc gọi điện thoại

Foreground service type to declare in manifest under
android:foregroundServiceType
phoneCall
Permission to declare in your manifest
FOREGROUND_SERVICE_PHONE_CALL
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_PHONE_CALL
Runtime prerequisites

At least one of these conditions must be true:

  • App is the default dialer app through the ROLE_DIALER role.
Description

Continue an ongoing call using the ConnectionService APIs.

Alternatives

If you need to make phone, video, or VoIP calls, consider using the android.telecom library.

Consider using CallScreeningService to screen calls.

Nhắn tin từ xa

Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceType
remoteMessaging
Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_REMOTE_MESSAGING
Hằng số để truyền đến startForeground()
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
Điều kiện tiên quyết về thời gian chạy
Không có
Nội dung mô tả
Chuyển tin nhắn văn bản từ thiết bị này sang thiết bị khác. Hỗ trợ người dùng nhắn tin liên tục khi họ chuyển đổi thiết bị.

Dịch vụ ngắn

Foreground service type to declare in manifest under
android:foregroundServiceType
shortService
Permission to declare in your manifest
None
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
Runtime prerequisites
None
Description

Quickly finish critical work that cannot be interrupted or postponed.

This type has some unique characteristics:

  • Can only run for a short period of time (about 3 minutes).
  • No support for sticky foreground services.
  • Cannot start other foreground services.
  • Doesn't require a type-specific permission, though it still requires the FOREGROUND_SERVICE permission.
  • A shortService can only change to another service type if the app is currently eligible to start a new foreground service.
  • A foreground service can change its type to shortService at any time, at which point the timeout period begins.

The timeout for shortService begins from the moment that Service.startForeground() is called. The app is expected to call Service.stopSelf() or Service.stopForeground() before the timeout occurs. Otherwise, the new Service.onTimeout() is called, giving apps a brief opportunity to call stopSelf() or stopForeground() to stop their service.

A short time after Service.onTimeout() is called, the app enters a cached state and is no longer considered to be in the foreground, unless the user is actively interacting with the app. A short time after the app is cached and the service has not stopped, the app receives an ANR. The ANR message mentions FOREGROUND_SERVICE_TYPE_SHORT_SERVICE. For these reasons, it's considered best practice to implement the Service.onTimeout() callback.

The Service.onTimeout() callback doesn't exist on Android 13 and lower. If the same service runs on such devices, it doesn't receive a timeout, nor does it ANR. Make sure that your service stops as soon as it finishes the processing task, even if it hasn't received the Service.onTimeout() callback yet.

It's important to note that if the timeout of the shortService is not respected, the app will ANR even if it has other valid foreground services or other app lifecycle processes running.

If an app is visible to the user or satisfies one of the exemptions that allow foreground services to be started from the background, calling Service.StartForeground() again with the FOREGROUND_SERVICE_TYPE_SHORT_SERVICE parameter extends the timeout by another 3 minutes. If the app isn't visible to the user and doesn't satisfy one of the exemptions, any attempt to start another foreground service, regardless of type, causes a ForegroundServiceStartNotAllowedException.

If a user disables battery optimization for your app, it's still affected by the timeout of shortService FGS.

If you start a foreground service that includes the shortService type and another foreground service type, the system ignores the shortService type declaration. However, the service must still adhere to the prerequisites of the other declared types. For more information, see the Foreground services documentation.

Cách sử dụng đặc biệt

Foreground service type to declare in manifest under
android:foregroundServiceType
specialUse
Permission to declare in your manifest
FOREGROUND_SERVICE_SPECIAL_USE
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
Runtime prerequisites
None
Description

Covers any valid foreground service use cases that aren't covered by the other foreground service types.

In addition to declaring the FOREGROUND_SERVICE_TYPE_SPECIAL_USE foreground service type, developers should declare use cases in the manifest. To do so, they specify the <property> element within the <service> element. These values and corresponding use cases are reviewed when you submit your app in the Google Play Console. The use cases you provide are free-form, and you should make sure to provide enough information to let the reviewer see why you need to use the specialUse type.

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

Được miễn trừ hệ thống

Foreground service type to declare in manifest under
android:foregroundServiceType
systemExempted
Permission to declare in your manifest
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
Runtime prerequisites
None
Description

Reserved for system applications and specific system integrations, to continue to use foreground services.

To use this type, an app must meet at least one of the following criteria:

  • Device is in demo mode state
  • App is a Device Owner
  • App is a Profiler Owner
  • Safety Apps that have the ROLE_EMERGENCY role
  • Device Admin apps
  • Apps holding SCHEDULE_EXACT_ALARM or USE_EXACT_ALARM permission and are using Foreground Service to continue alarms in the background, including haptics-only alarms.
  • VPN apps (configured using Settings > Network & Internet > VPN)

    Otherwise, declaring this type causes the system to throw a ForegroundServiceTypeNotAllowedException.

Phương thức thực thi chính sách của Google Play đối với việc sử dụng các loại dịch vụ trên nền trước

Nếu ứng dụng của bạn nhắm đến Android 14 trở lên, bạn cần khai báo các loại dịch vụ trên nền trước của ứng dụng trên trang nội dung ứng dụng của Play Console (Chính sách > Nội dung ứng dụng). Để biết thêm thông tin về cách khai báo các loại dịch vụ trên nền trước trong Play Console, hãy xem bài viết Tìm hiểu các yêu cầu khi sử dụng ý định truy cập chế độ toàn màn hình và dịch vụ trên nền trước.