Kể từ Android 14 (API cấp 34), bạn phải khai báo loại dịch vụ thích hợp cho từng dịch vụ trên nền trước. Điều đó nghĩa là bạn phải khai báo loại dịch vụ trong tệp kê khai ứng dụng, cũng như yêu cầu quyền sử dụng dịch vụ trên nền trước thích hợp cho loại đó (ngoài việc yêu cầu quyền FOREGROUND_SERVICE
). Hơn nữa, 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 khi bắt đầu chạy trước khi chạy dịch vụ.
Camera
- 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à nhận quyền khi bắt đầu chạy
CAMERA
Lưu ý: Quyền khi bắt đầu chạy
CAMERA
phải tuân theo các hạn chế khi sử dụng. Vì lý do này, bạn không thể tạo dịch vụcamera
trên nền trước trong khi ứng dụng chạy ở chế độ nền, với một số trường hợp ngoại lệ. Để biết thêm thông tin, hãy xem phần Các quy định hạn chế khi bắt đầu các dịch vụ trên nền trước cần quyền trong khi sử dụng.- Nội dung mô tả
Tiếp tục truy cập vào máy ảnh từ 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
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai trong
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:
Khai báo ít nhất một trong các quyền sau đây trong tệp kê khai:
Yêu cầu và được cấp ít nhất một trong các quyền sau đây khi bắt đầu chạy:
- 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.
- Phương á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 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 nằm 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 trong
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
- Phương án thay thế
Xem Lựa chọn thay thế cho dịch vụ trên nền trước về đồng bộ hoá dữ liệu để 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 trong
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 sau đây khi bắt đầu chạy:
Lưu ý: Quyền khi bắt đầu chạy
BODY_SENSORS
phải tuân theo các hạn chế khi sử dụng. Vì lý do này, bạn không thể tạo dịch vụhealth
trên nền trước. Dịch vụ này sử dụng cảm biến cơ thể trong khi ứng dụng chạy ở chế độ nền, ngoại trừ một vài trường hợp ngoại lệ. Để biết thêm thông tin, hãy xem phần Các quy định hạn chế khi bắt đầu các dịch vụ trên nền trước cần quyền trong khi sử dụng.- Nội dung 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í
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai trong
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 khi bắt đầu chạy hay chưa, hãy sử dụng
PermissionChecker#checkSelfPermission()
Lưu ý: Các quyền truy cập thông tin vị trí khi bắt đầu chạy phải tuân theo các quy định hạn chế trong khi 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 khi bắt đầu chạyACCESS_BACKGROUND_LOCATION
. Để biết thêm thông tin, hãy xem Quy định hạn chế khi bắt đầu các dịch vụ trên nền trước mà cần có quyền trong khi sử dụng.- Nội dung 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í.
- Phương á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 các 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 trong
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.
- Phương á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 trong
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
Hã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 thông báo về quyền; 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()
.- Nội dung 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 API
MediaProjection
. Nội dung này không nhất thiết chỉ là nội dung đa phương tiện.- Phương á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 dùng SDK Google Cast.
Micrô
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai trong
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à nhận quyền khi bắt đầu chạy
RECORD_AUDIO
.Lưu ý: Quyền khi bắt đầu chạy
RECORD_AUDIO
phải tuân theo các hạn chế khi sử dụng. Vì lý do này, bạn không thể tạo dịch vụmicrophone
trên nền trước trong khi ứng dụng chạy ở chế độ nền, với một số trường hợp ngoại lệ. Để biết thêm thông tin, hãy xem phần Các quy định hạn chế khi bắt đầu các dịch vụ trên nền trước cần quyền trong khi sử dụng.- Nội dung 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 trong
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 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ò
- Nội dung mô tả
Tiếp tục cuộc gọi đang diễn ra bằng các API
ConnectionService
.- Phương án thay thế
Nếu bạn cần gọi điện thoại, gọi video hoặc gọi VoIP, hãy cân nhắc sử dụng thư viện
android.telecom
.Hãy 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 trong
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 trong
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 sang 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ụ mới trên nền trước.- Dịch vụ trên nền trước có thể thay đổi kiểu của dịch vụ này thành
shortService
bất cứ lúc nào. Lúc đó, khoảng thời gian chờ sẽ 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ủ đ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
- Loại dịch vụ trên nền trước cần khai báo trong tệp kê khai trong
android:foregroundServiceType
specialUse
- Quyền khai báo trong tệp kê khai
FOREGROUND_SERVICE_SPECIAL_USE
- Hằng số để truyền đến
startForeground()
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
- Điều kiện tiên quyết về thời gian chạy
- Không có
- Nội dung mô tả
Bao gồm mọi trường hợp sử dụng dịch vụ trên nền trước hợp lệ không thuộc các loại dịch vụ trên nền trước khác.
Ngoài việc khai báo loại dịch vụ trên nền trước
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
, nhà phát triển nên khai báo các trường hợp sử dụng trong tệp kê khai. Để làm vậy, họ cần chỉ định phần tử<property>
trong phần tử<service>
. Các giá trị này và trường hợp sử dụng tương ứng sẽ được xem xét khi bạn gửi ứng dụng trong Google Play Console. Việc sử dụng yêu cầu của bạn là theo mẫu tuỳ ý và bạn cần đảm bảo cung cấp đủ để cho nhân viên đánh giá biết lý do bạn cần sử dụngspecialUse
loại.<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 trong
android:foregroundServiceType
systemExempted
- 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à 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ị
- Các ứng dụng có
SCHEDULE_EXACT_ALARM
hoặcUSE_EXACT_ALARM
và đang sử dụng Dịch vụ trên nền trước để tiếp tục chuông báo trong nền, bao gồm cả báo thức chỉ dùng xúc giác. Ứng dụng VPN (được định cấu hình bằng cách sử dụng phần 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 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 về ý định truy cập chế độ toàn màn hình và dịch vụ trên nền trước.