Kể từ Android 11, các dịch vụ AIDL gốc chạy trong phân vùng hệ thống có thể được khởi động và dừng một cách linh động khi cần. Các dịch vụ động bắt đầu khi được yêu cầu lần đầu tiên và tự động dừng khi không còn được sử dụng.
Các dịch vụ có thể chạy động
Tính năng này chỉ dành cho các dịch vụ gốc có thể được kiểm soát vòng đời bằng init
và servicemanager
. Các dịch vụ trong gói ứng dụng không được hỗ trợ mà nên dùng dịch vụ ràng buộc.
Tính năng tắt động hoạt động bằng cách tắt quy trình mà dịch vụ chạy. Nếu tồn tại nhiều dịch vụ trong cùng một quy trình, thì tất cả các dịch vụ đó phải được đăng ký dưới dạng động để tương thích với tính năng này. Sau đó, quy trình đó sẽ tắt khi tất cả các dịch vụ không được sử dụng.
Định cấu hình tệp .rc khởi động của dịch vụ
Để chạy một dịch vụ một cách linh động, hãy thêm các tuỳ chọn sau vào tệp .rc
khởi động của dịch vụ sau dòng service <name> <cmd>
đầu tiên.
interface aidl serviceName
disabled
oneshot
Các tuỳ chọn này thực hiện những việc sau:
interface aidl serviceName
: Cho phépservicemanager
tìm thấy dịch vụ. Nếu dịch vụ sử dụng nhiều giao diện, hãy khai báo từng giao diện trên một dòng riêng. Những tên này phải chính xác nhưservicemanager
mong đợi và có thể khác với tên quy trình.disabled
: Ngăn dịch vụ tự động khởi động khi khởi động.oneshot
: Ngăn dịch vụ tự động khởi động lại mỗi khi bị dừng.
Để biết thêm thông tin, hãy xem Tệp Readme về ngôn ngữ khởi động Android trong AOSP.
Ví dụ:
Đăng ký dịch vụ
Mỗi dịch vụ được tạo và đăng ký bằng servicemanager
. Việc đăng ký thường diễn ra trong một tệp có tên là main.cpp
, nhưng cách triển khai có thể khác nhau. Thông tin đăng ký thường có dạng như sau:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
Đôi khi, quá trình đăng ký được BinderService::publish
hoặc BinderService::instantiate
trừu tượng hoá, các lớp này sẽ gọi mã ở trên.
Để đăng ký một dịch vụ dưới dạng động, hãy thay thế mã đăng ký của dịch vụ đó bằng mã sau:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager
giao tiếp với LazyServiceRegistrar
để tắt các dịch vụ dựa trên số lượng tham chiếu của chúng.
Ví dụ:
Định cấu hình ứng dụng khách dịch vụ AIDL
Nhận dịch vụ
Để truy xuất dịch vụ tải lười, bạn phải khởi động rồi truy xuất dịch vụ đó.
Việc gọi getService
trên trình quản lý dịch vụ sẽ bắt đầu dịch vụ, nhưng thông thường, bạn muốn nhận dịch vụ ngay khi có và nên sử dụng các biến thể waitForService
. Hãy xem tài liệu dành riêng cho phần phụ trợ về cách sử dụng các API này.
Phát hành dịch vụ
Việc tắt động dựa trên tính năng đếm tham chiếu, vì vậy, ứng dụng không được giữ lại dịch vụ khi không sử dụng.
Ví dụ:
Tạm thời tắt tính năng tắt máy
Nếu muốn một dịch vụ chạy độc lập cho đến khi hoàn thành một số tác vụ nhất định rồi chuyển sang hành vi động, bạn có thể sử dụng LazyServiceRegistrar::forcePersist
để bật và tắt tính năng tắt động. Nếu được gọi từ phía máy chủ, thì tính năng này phải được gọi trước registerService
.
Ví dụ: apexservice