Để giúp nhà phát triển thể hiện rõ ý định khi xác định dịch vụ trên nền trước dành cho người dùng, Android 10 đã cho ra mắt thuộc tính android:foregroundServiceType trong phần tử <service>.
Nếu ứng dụng của bạn nhắm đến Android 14, thì ứng dụng đó phải chỉ định các kiểu dịch vụ thích hợp trên nền trước. Như trong các phiên bản Android trước đây, bạn có thể kết hợp nhiều kiểu. Danh sách này cho thấy các kiểu dịch vụ trên nền trước để bạn lựa chọn:
cameraconnectedDevicedataSynchealthlocationmediaPlaybackmediaProjectionmicrophonephoneCallremoteMessagingshortServicespecialUsesystemExempted
Nếu một trường hợp sử dụng trong ứng dụng không liên quan đến bất cứ kiểu nào trong số này, bạn nên di chuyển logic để sử dụng WorkManager hoặc công việc chuyển dữ liệu do người dùng khởi tạo.
health, remoteMessaging, shortService, specialUse và systemExempted là các kiểu mới trong Android 14.
Đoạn mã sau đây cho thấy ví dụ về cách khai báo kiểu dịch vụ trên nền trước trong tệp kê khai:
<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>
Nếu một ứng dụng nhắm đến Android 14 không xác định kiểu cho một dịch vụ nhất định trong tệp kê khai, thì hệ thống sẽ tăng MissingForegroundServiceTypeException khi gọi startForeground() cho dịch vụ đó.
Khai báo quyền mới để sử dụng các loại dịch vụ trên nền trước
Nếu ứng dụng nhắm đến Android 14 và có sử dụng dịch vụ trên nền trước, thì ứng dụng đó phải khai báo một quyền cụ thể, dựa trên loại dịch vụ trên nền trước mà Android 14 ra mắt. Các quyền này xuất hiện trong những phần có nhãn "quyền mà bạn phải khai báo trong tệp kê khai" trong phần các trường hợp sử dụng dự kiến và biện pháp thực thi cho từng loại dịch vụ trên nền trước trên trang này.
Tất cả quyền đó được xác định là quyền thông thường và được cấp theo mặc định. Người dùng không thể thu hồi các quyền này.
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ả location và mediaPlayback 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
The system checks for proper use of foreground service types and confirms that
the app has requested the proper runtime permissions or uses the required APIs.
For instance, the system expects apps that use the foreground service type
FOREGROUND_SERVICE_TYPE_LOCATION type to request either
ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION.
This implies that apps must follow a very specific
order of operations when requesting permissions from the user and starting
foreground services. Permissions must be requested and granted before the
app attempts to call startForeground(). Apps that request the appropriate
permissions after the foreground service has been started must change this order
of operations and request the permission before starting the foreground service.
The specifics of platform enforcement appear in the sections labeled "runtime requirements" in the intended use cases and enforcement for each foreground service type section on this page.
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
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai trong
android:foregroundServiceType camera- Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_CAMERA- Hằng số để truyền đến
startForeground() FOREGROUND_SERVICE_TYPE_CAMERA- Điều kiện tiên quyết về thời gian chạy
Yêu cầu và được cấp quyền khi bắt đầu chạy
CAMERALưu ý: Quyền khi bắt đầu chạy
CAMERAphả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ướccamerakhi ứng dụng đang chạy ở chế độ nền, ngoại trừ một số trường hợp ngoại lệ. Để 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ả
Tiếp tục truy cập vào máy ảnh ở chế độ nền, chẳng hạn như các ứng dụng trò chuyện video cho phép thực thi đa nhiệm.
Thiết bị đã kết nối
- Foreground service type to declare in manifest under
android:foregroundServiceTypeconnectedDevice- Permission to declare in your manifest
FOREGROUND_SERVICE_CONNECTED_DEVICE- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE- Runtime prerequisites
At least one of the following conditions must be true:
Declare at least one of the following permissions in your manifest:
Request and be granted at least one of the following runtime permissions:
- Description
Interactions with external devices that require a Bluetooth, NFC, IR, USB, or network connection.
- Alternatives
If your app needs to do continuous data transfer to an external device, consider using the companion device manager instead. Use the companion device presence API to help your app stay running while the companion device is in range.
If your app needs to scan for bluetooth devices, consider using the Bluetooth scan API instead.
Đồ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:foregroundServiceTypedataSync- 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ẻ
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceTypehealth- Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_HEALTH- Hằng số để truyền đến
startForeground() FOREGROUND_SERVICE_TYPE_HEALTH- Đ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:
Khai báo quyền
HIGH_SAMPLING_RATE_SENSORStrong tệp kê khai.Yêu cầu và được cấp ít nhất một trong các quyền khi bắt đầu chạy sau đây:
BODY_SENSORStrên API cấp 35 trở xuốngREAD_HEART_RATEREAD_SKIN_TEMPERATUREREAD_OXYGEN_SATURATIONACTIVITY_RECOGNITION
Lưu ý: Quyền khi bắt đầu chạy ĐỌC dựa trên cảm biến và
BODY_SENSORSphải tuân thủ các hạn chế khi đang sử dụng. Vì lý do này, bạn không thể tạo một dịch vụ trên nền trướchealthsử dụng cảm biến cơ thể trong khi ứng dụng của bạn đang chạy ở chế độ nền, trừ phi bạn đã được cấp quyềnBODY_SENSORS_BACKGROUND(API cấp 33 đến 35) hoặcREAD_HEALTH_DATA_IN_BACKGROUND(API cấp 36 trở lên). Để 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ả
Trường hợp sử dụng lâu dài bất kỳ để hỗ trợ các ứng dụng trong danh mục thể dục (ví dụ: trình theo dõi bài tập thể dục).
Vị trí
- Foreground service type to declare in manifest under
android:foregroundServiceTypelocation- Permission to declare in your manifest
FOREGROUND_SERVICE_LOCATION- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_LOCATION- Runtime prerequisites
The user must have enabled location services and the app must be granted at least one of the following runtime permissions:
Note: In order to check that the user has enabled location services as well as granted access to the runtime permissions, use
PermissionChecker#checkSelfPermission()Note: The location runtime permissions are subject to while-in-use restrictions. For this reason, you cannot create a
locationforeground service while your app is in the background, unless you've been granted theACCESS_BACKGROUND_LOCATIONruntime permission. For more information, see Restrictions on starting foreground services that need while-in-use permissions.- Description
Long-running use cases that require location access, such as navigation and location sharing.
- Alternatives
If your app needs to be triggered when the user reaches specific locations, consider using the geofence API instead.
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:foregroundServiceTypemediaPlayback- 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
- Foreground service type to declare in manifest under
android:foregroundServiceTypemediaProjection- Permission to declare in your manifest
FOREGROUND_SERVICE_MEDIA_PROJECTION- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION- Runtime prerequisites
Call the
createScreenCaptureIntent()method before starting the foreground service. Doing so shows a permission notification to the user; the user must grant the permission before you can create the service.After you have created the foreground service, you can call
MediaProjectionManager.getMediaProjection().- Description
Project content to non-primary display or external device using the
MediaProjectionAPIs. This content doesn't have to be exclusively media content.- Alternatives
To stream media to another device, use the Google Cast SDK.
Micrô
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceTypemicrophone- Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_MICROPHONE- Hằng số để truyền đến
startForeground() FOREGROUND_SERVICE_TYPE_MICROPHONE- Điều kiện tiên quyết về thời gian chạy
Yêu cầu và được cấp quyền khi bắt đầu chạy
RECORD_AUDIO.Lưu ý: Quyền khi bắt đầu chạy
RECORD_AUDIOphả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ướcmicrophonekhi ứng dụng đang chạy ở chế độ nền, ngoại trừ một số trường hợp ngoại lệ. Để 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ả
Tiếp tục ghi âm qua micrô ở chế độ nền, chẳng hạn như trình ghi âm giọng nói hoặc ứng dụng giao tiếp.
Cuộc gọi điện thoại
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceTypephoneCall- Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_PHONE_CALL- Hằng số để truyền đến
startForeground() FOREGROUND_SERVICE_TYPE_PHONE_CALL- Đ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:
- Ứng dụng đã khai báo quyền
MANAGE_OWN_CALLStrong tệp kê khai.
- Ứng dụng đã khai báo quyền
- Ứng dụng là ứng dụng quay số mặc định thông qua vai trò
ROLE_DIALER.
- Ứng dụng là ứng dụng quay số mặc định thông qua vai trò
- Mô tả
Tiếp tục cuộc gọi đang diễn ra bằng các API
ConnectionService.- Lựa chọn thay thế
Nếu bạn cần thực hiện cuộc gọi điện thoại, video hoặc VoIP, hãy cân nhắc sử dụng thư viện
android.telecom.Cân nhắc sử dụng
CallScreeningServiceđể sàng lọc cuộc gọi.
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:foregroundServiceTyperemoteMessaging- 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
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceTypeshortService- Quyền khai báo trong tệp kê khai
- Không có
- Hằng số để truyền đến
startForeground() FOREGROUND_SERVICE_TYPE_SHORT_SERVICE- Điều kiện tiên quyết về thời gian chạy
- Không có
- Nội dung mô tả
Nhanh chóng hoàn tất công việc quan trọng mà không bị gián đoạn hoặc trì hoãn.
Kiểu này có một số đặc điểm riêng biệt:
- Chỉ chạy được trong một khoảng thời gian ngắn (khoảng 3 phút).
- Không hỗ trợ các dịch vụ cố định trên nền trước.
- Không thể bắt đầu các dịch vụ trên nền trước khác.
- Không yêu cầu quyền dành riêng cho từng kiểu, tuy vẫn đòi hỏi quyền
FOREGROUND_SERVICE. shortServicechỉ có thể thay đổi thành một loại dịch vụ khác nếu ứng dụng hiện đủ điều kiện để bắt đầu một dịch vụ trên nền trước mới.- Dịch vụ trên nền trước có thể thay đổi loại thành
shortServicebất cứ lúc nào, tại thời điểm đó, khoảng thời gian chờ bắt đầu.
Thời gian chờ đối với shortService bắt đầu từ thời điểm gọi
Service.startForeground(). Ứng dụng dự kiến sẽ gọiService.stopSelf()hoặcService.stopForeground()trước khi hết thời gian chờ. Nếu không,Service.onTimeout()mới sẽ được gọi, mang đến cho ứng dụng một khoảng thời gian ngắn để gọistopSelf()hoặcstopForeground()nhằm dừng dịch vụ.Một thời gian ngắn sau khi
Service.onTimeout()được gọi, ứng dụng sẽ chuyển sang một trạng thái lưu trong bộ nhớ đệm và không còn được xem là chạy ở nền trước, trừ trường hợp người dùng chủ động tương tác với ứng dụng. Một thời gian ngắn sau khi ứng dụng được lưu vào bộ nhớ đệm và dịch vụ vẫn chưa bị dừng, ứng dụng sẽ nhận được một lỗi ANR. Thông báo lỗi ANR đó nhắc đếnFOREGROUND_SERVICE_TYPE_SHORT_SERVICE. Vì những lý do này, cách tốt nhất là triển khai lệnh gọi lạiService.onTimeout().Lệnh gọi lại
Service.onTimeout()không tồn tại trên Android 13 trở xuống. Nếu cùng một dịch vụ chạy trên các thiết bị như vậy, thì dịch vụ đó sẽ không bị hết thời gian chờ cũng như không gặp lỗi ANR. Hãy đảm bảo dịch vụ của bạn dừng ngay sau khi hoàn tất tác vụ xử lý, kể cả khi chưa nhận được lệnh gọi lạiService.onTimeout().Điều quan trọng bạn cần lưu ý là nếu không hết thời gian chờ của
shortService, ứng dụng sẽ gặp lỗi ANR ngay cả khi có các dịch vụ trên nền trước hợp lệ khác hoặc các quy trình khác trong vòng đời của ứng dụng.Nếu người dùng nhìn thấy ứng dụng hoặc ứng dụng đáp ứng một trong các quy tắc miễn trừ cho phép bắt đầu chạy các dịch vụ trên nền trước từ chế độ nền, hãy gọi
Service.StartForeground()một lần nữa bằng tham sốFOREGROUND_SERVICE_TYPE_SHORT_SERVICE(kéo dài thời gian chờ thêm 3 phút nữa). Nếu người dùng không nhìn thấy ứng dụng và ứng dụng không đáp ứng một trong các quy tắc miễn trừ, thì mọi cố gắng bắt đầu một dịch vụ trên nền trước khác, bất kể kiểu nào, cũng sẽ gây raForegroundServiceStartNotAllowedExceptionNếu người dùng tắt tính năng tối ưu hoá pin cho ứng dụng, thì ứng dụng vẫn bị ảnh hưởng bởi thời gian chờ của dịch vụ shortService trên nền trước.
Nếu bạn bắt đầu một dịch vụ trên nền trước bao gồm kiểu
shortServicevà một kiểu dịch vụ trên nền trước khác, hệ thống sẽ bỏ qua phần khai báo cho kiểushortService. Tuy nhiên, dịch vụ vẫn phải tuân thủ các điều kiện tiên quyết của các kiểu khác đã khai báo. Để biết thêm thông tin, hãy xem tài liệu về Dịch vụ trên nền trước.
Cách sử dụng đặc biệt
- Foreground service type to declare in manifest under
android:foregroundServiceTypespecialUse- 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_USEforeground 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 thespecialUsetype.<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
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceTypesystemExempted- Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_SYSTEM_EXEMPTED- Hằng số để truyền đến
startForeground() FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED- Điều kiện tiên quyết về thời gian chạy
- Không có
- Mô tả
Dành riêng cho các ứng dụng hệ thống và chế độ tích hợp hệ thống cụ thể để tiếp tục sử dụng các dịch vụ trên nền trước.
Để sử dụng loại này, ứng dụng phải đáp ứng ít nhất một trong các tiêu chí sau:
- Thiết bị đang ở trạng thái chế độ minh hoạ
- Ứng dụng là Chủ sở hữu thiết bị
- Ứng dụng là Chủ sở hữu trình phân tích tài nguyên
- Ứng dụng An toàn có vai trò
ROLE_EMERGENCY - Ứng dụng Quản trị thiết bị
- Ứng dụng có quyền
SCHEDULE_EXACT_ALARMhoặcUSE_EXACT_ALARMvà đang sử dụng Dịch vụ trên nền trước để tiếp tục chuông báo ở chế độ nền, bao gồm cả chuông báo chỉ có phản hồi xúc giác. Ứng dụng VPN (được định cấu hình bằng cách sử dụng Cài đặt > Mạng và Internet > VPN)
Nếu không, việc khai báo loại này sẽ khiến hệ thống gửi ra một
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.