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

Để 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:

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, specialUsesystemExempted 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 để các ứng dụng 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 bitwise số nguyên 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 dễ dàng đáp ứng các kỳ vọng của hệ thống đối với mỗi nền trước loại dịch vụ. Trong trường hợp một dịch vụ trên nền trước được bắt đầu bằng nhiều loại, thì dịch vụ trên nền trước phải tuân thủ việc thực thi nền tảng các yêu cầu thuộc tất cả các loại.

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 mặc định thành các giá trị được xác định trong tệp kê khai. Nếu bạn không chỉ định dịch vụ nhập vào 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 dịch vụ trình theo dõi hoạt động chạy luôn cần location, nhưng có thể cần hoặc không cần quyền media. Bạn sẽ 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 cho startForeground() rồi 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.

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:

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

要在其清单中声明的前台服务类型
android:foregroundServiceType
dataSync
在清单中声明的权限
FOREGROUND_SERVICE_DATA_SYNC
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_DATA_SYNC
运行时前提条件
说明

数据传输操作,例如:

  • 数据上传或下载
  • 备份和恢复操作
  • 导入或导出操作
  • 获取数据
  • 本地文件处理
  • 通过网络在设备和云端之间传输数据
替代方案

如需了解详情,请参阅数据同步前台服务的替代方案

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:

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í

要在清单中声明的前台服务类型
android:foregroundServiceType
location
在清单中声明的权限
FOREGROUND_SERVICE_LOCATION
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_LOCATION
运行时前提条件

用户必须已启用位置信息服务,并且必须至少向应用授予以下运行时权限之一:

注意:如需检查用户是否已启用位置信息服务以及是否已授予运行时权限的访问权限,请使用 PermissionChecker#checkSelfPermission()

注意:位置信息运行时权限受使用时限制的约束。因此,当应用在后台运行时,您无法创建 location 前台服务,除非您已被授予 ACCESS_BACKGROUND_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 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ô

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

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

注意RECORD_AUDIO 运行时权限受使用时限制。因此,当您的应用位于后台时,您无法创建 microphone 前台服务,但存在一些例外情况。如需了解详情,请参阅有关启动需要运行时权限的前台服务的限制

说明

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

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 là ứng dụng quay số mặc định thông qua vai trò ROLE_DIALER.
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ọi Service.stopSelf() hoặc Service.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ọi stopSelf() hoặc stopForeground() 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 đến FOREGROUND_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ại Service.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ại Service.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 ra ForegroundServiceStartNotAllowedException

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ểu shortService. 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

要在清单中声明的前台服务类型
android:foregroundServiceType
specialUse
在清单中声明的权限
FOREGROUND_SERVICE_SPECIAL_USE
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
运行时前提条件
说明

涵盖其他前台服务类型未涵盖的所有有效前台服务用例。

除了声明 FOREGROUND_SERVICE_TYPE_SPECIAL_USE 前台服务类型之外,开发者还应在清单中声明用例。为此,他们会在 <service> 元素内指定 <property> 元素。当您在 Google Play 管理中心内提交应用时,我们会审核这些值和相应的用例。用途 您提供的案例均为自由形式,因此,您应确保提供足够的 相关信息,让审核人员了解您为何需要使用 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

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:

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.