در اندروید ۱۱ و بالاتر، سرویسهای AIDL بومی که در پارتیشن سیستم اجرا میشوند، میتوانند به صورت پویا در صورت نیاز شروع و متوقف شوند. سرویسهای پویا زمانی که برای اولین بار درخواست میشوند، شروع میشوند و زمانی که دیگر مورد استفاده قرار نمیگیرند، به طور خودکار متوقف میشوند.
سرویسهایی که میتوانند به صورت پویا اجرا شوند
این ویژگی فقط برای سرویسهای بومی که چرخه حیات آنها توسط init و servicemanager قابل کنترل است، در دسترس است. سرویسهای درون بستههای برنامه پشتیبانی نمیشوند و باید به جای آنها از سرویسهای محدود استفاده کنند.
خاموش کردن پویا با خاموش کردن فرآیندی که سرویس در آن اجرا میشود، کار میکند. اگر چندین سرویس در یک فرآیند وجود داشته باشد، همه آنها باید به عنوان پویا ثبت شوند تا با این ویژگی سازگار باشند. سپس وقتی همه سرویسها بلااستفاده شدند، آن فرآیند خاموش میشود.
پیکربندی فایل init.rc یک سرویس
برای اجرای پویای یک سرویس، گزینههای زیر را به فایل init .rc سرویس، پس از خط service <name> <cmd> قرار دارد، اضافه کنید.
interface aidl serviceName
disabled
oneshot
این گزینهها موارد زیر را انجام میدهند:
-
interface aidl serviceName: بهservicemanagerاجازه میدهد تا سرویس را پیدا کند. اگر سرویس از چندین رابط استفاده میکند، هر رابط را در خط جداگانه تعریف کنید. این نامها باید دقیقاً همان چیزی باشند کهservicemanagerانتظار دارد و ممکن است با نام فرآیند متفاوت باشند. -
disabled: از شروع خودکار سرویس در هنگام بوت جلوگیری میکند. -
oneshot: از راهاندازی مجدد خودکار سرویس پس از هر بار توقف (stop) جلوگیری میکند.
برای اطلاعات بیشتر، به فایل Readme مربوط به زبان اولیه اندروید در AOSP مراجعه کنید.
مثالها:
ثبت یک سرویس
هر سرویس با servicemanager ایجاد و ثبت میشود. ثبت اغلب در فایلی به نام main.cpp انجام میشود، اما پیادهسازی آن میتواند متفاوت باشد. ثبت معمولاً چیزی شبیه به این است:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
ثبت گاهی اوقات توسط BinderService::publish یا BinderService::instantiate که کد بالا را فراخوانی میکنند، خلاصهسازی میشود.
برای ثبت یک سرویس به عنوان پویا، کد ثبت آن را با کد زیر جایگزین کنید:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager با LazyServiceRegistrar ارتباط برقرار میکند تا سرویسها را بر اساس تعداد ارجاعاتشان خاموش کند.
مثالها:
پیکربندی کلاینتهای سرویس AIDL
سرویس را دریافت کنید
برای بازیابی یک سرویس lazy، سرویس باید شروع و سپس بازیابی شود. فراخوانی getService در مدیریت سرویس، سرویس را شروع میکند، اما معمولاً میخواهید سرویس را به محض در دسترس بودن دریافت کنید و باید از انواع waitForService استفاده شود. برای نحوه استفاده از این موارد، به مستندات مربوط به backend مراجعه کنید.
سرویس را آزاد کنید
خاموش کردن پویا بر اساس شمارش مرجع است، بنابراین کلاینتها نباید وقتی سرویسی در حال استفاده نیست، آن را نگه دارند.
مثالها:
غیرفعال کردن موقت خاموش کردن
اگر میخواهید یک سرویس تا زمان تکمیل وظایف خاص به طور مستقل اجرا شود و سپس به رفتار پویا تغییر یابد، میتوانید از LazyServiceRegistrar::forcePersist برای روشن و خاموش کردن خاموش کردن پویا استفاده کنید. اگر این از سمت سرور فراخوانی میشود، باید قبل از registerService فراخوانی شود.
مثال: apexservice