Kể từ Android 14 (API cấp 34), bạn phải khai báo một loại dịch vụ phù hợp cho mỗi dịch vụ trên nền trước. Tức là bạn phải khai báo loại dịch vụ trong tệp kê khai ứng dụng, đồng thời yêu cầu quyền dịch vụ trên nền trước phù hợp cho loại dịch vụ đó (ngoài việc yêu cầu quyền FOREGROUND_SERVICE
). Ngoài ra, tuỳ thuộc vào loại dịch vụ trên nền trước, bạn có thể phải yêu cầu quyền trong thời gian chạy trước khi chạy dịch vụ.
Camera
- 要在清单中
android:foregroundServiceType
下声明的前台服务类型 camera
- 要在清单中声明的权限
FOREGROUND_SERVICE_CAMERA
- 要传递给
startForeground()
的常量 FOREGROUND_SERVICE_TYPE_CAMERA
- 运行时前提条件
请求并被授予
CAMERA
运行时权限- 说明
继续在后台访问相机,例如支持多任务的视频聊天应用。
Thiết bị đã kết nối
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
connectedDevice
- 在清单中声明的权限
FOREGROUND_SERVICE_CONNECTED_DEVICE
- 要传递给
startForeground()
的常量 FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
- 运行时前提条件
必须至少满足以下其中一个条件:
在清单中至少声明以下其中一项权限:
至少请求并被授予以下其中一项运行时权限:
- 说明
与需要蓝牙、NFC、IR、USB 或网络连接的外部设备进行互动。
- 替代方案
如果您的应用需要向外部设备持续传输数据,请考虑改用配套设备管理器。使用配套设备感知 API,可帮助您的应用在配套设备在范围内时保持运行。
如果您的应用需要扫描蓝牙设备,请考虑改用 Bluetooth Scan API。
Đồ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 bài viết Các lựa chọn 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:foregroundServiceType
health
- 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_SENSORS
trong 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_SENSORS
trên API 35 trở xuốngREAD_HEART_RATE
READ_SKIN_TEMPERATURE
READ_OXYGEN_SATURATION
ACTIVITY_RECOGNITION
- 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í
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
location
- 在清单中声明的权限
FOREGROUND_SERVICE_LOCATION
- 要传递给
startForeground()
的常量 FOREGROUND_SERVICE_TYPE_LOCATION
- 运行时前提条件
用户必须已启用位置信息服务,并且应用必须至少获得以下一项运行时权限:
- 说明
需要位置信息使用权的长时间运行的用例,例如导航和位置信息分享。
- 替代方案
如果您的应用需要在用户到达特定位置时触发,请考虑改用 Geofence API。
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 chiếu video ở chế độ hình trong hình, hãy sử dụng chế độ Hình trong hình.
Xử lý phương tiện
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
mediaProcessing
- 在清单中声明的权限
FOREGROUND_SERVICE_MEDIA_PROCESSING
- 要传递给
startForeground()
的常量 FOREGROUND_SERVICE_TYPE_MEDIA_PROCESSING
- 运行时前提条件
- 无
- 说明
用于对媒体资源执行耗时的操作(例如将媒体转换为其他格式)的服务。系统允许此服务运行的时间有限;在正常情况下,此时限为每天 24 小时中的 6 小时。(此限制由应用的所有
mediaProcessing
前台服务共享。)在以下情况下,您的应用应手动停止媒体处理服务:
- 当转码操作完成或达到失败状态时,让服务调用
Service.stopForeground()
和Service.stopSelf()
以完全停止服务。
- 当转码操作完成或达到失败状态时,让服务调用
如果超时期限已到,系统会调用服务的
Service.onTimeout(int, int)
方法。此时,该服务有几秒钟的时间来调用Service.stopSelf()
。如果服务未调用Service.stopSelf()
,则会发生 ANR,并显示以下错误消息:“<fgs_type> 的前台服务未在超时时间内停止:<component_name>”。注意:
Service.onTimeout(int, int)
不适用于 Android 14 或更低版本。在搭载这些版本的设备上,如果媒体处理服务达到超时期限,系统会立即缓存应用。因此,您的应用不应等待收到超时通知。相反,它应在适当情况下尽快终止前台服务或将其更改为后台服务。
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ẽ cho người dùng thấy một thông báo về quyền; người dùng phải cấp quyền trước khi bạn 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 lên 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 nghe nhìn.- Lựa chọn thay thế
Để truyền trực tuyến nội dung nghe nhìn đến một thiết bị khác, hãy sử dụng 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:foregroundServiceType
microphone
- 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
.- 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:foregroundServiceType
phoneCall
- 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_CALLS
trong tệp kê khai.
- Ứng dụng đã khai báo quyền
- Ứng dụng là ứng dụng gọi điện mặc định thông qua vai trò
ROLE_DIALER
.
- Ứng dụng là ứng dụng gọi điện 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 cần thực hiện cuộc gọi điện thoại, cuộc gọi video hoặc cuộc gọi 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: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
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai theo
android:foregroundServiceType
shortService
- 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
. shortService
chỉ 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
shortService
bấ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 raForegroundServiceStartNotAllowedException
Nế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
shortService
và 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
- 要在清单中声明的前台服务类型
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>
Được miễn trừ hệ thống
- 要在其清单中声明的前台服务类型
android:foregroundServiceType
systemExempted
- 在清单中声明的权限
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
- 要传递给
startForeground()
的常量 FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
- 运行时前提条件
- 无
- 说明
为系统应用和特定系统集成预留,以便继续使用前台服务。
如需使用此类型,应用必须至少满足以下条件之一:
- 设备处于演示模式状态
- 应用是设备所有者
- 应用是性能分析器所有者
- 属于具有
ROLE_EMERGENCY
角色的安全应用 - 属于设备管理应用
- 具有
SCHEDULE_EXACT_ALARM
或USE_EXACT_ALARM
权限的应用 VPN 应用(通过设置 > 网络和互联网 > VPN 进行配置)
否则,声明此类型会导致系统抛出
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.