استفاده از wake lock می تواند عملکرد دستگاه را مختل کند. اگر نیاز به استفاده از wake lock دارید، مهم است که آن را به درستی انجام دهید. این سند برخی از بهترین روشها را پوشش میدهد که میتواند به شما در جلوگیری از دامهای متداول wake lock کمک کند.
wake lock را به درستی نامگذاری کنید
توصیه می کنیم نام بسته، کلاس یا روش خود را در برچسب wakelock قرار دهید. به این ترتیب، اگر خطایی رخ دهد، پیدا کردن مکان در کد منبع خود که در آن wake lock ایجاد شده است، آسان تر است. در اینجا چند نکته اضافی وجود دارد:
- هرگونه اطلاعات شناسایی شخصی (PII) را در نام، مانند آدرس ایمیل، کنار بگذارید. اگر دستگاه PII را در برچسب wake lock تشخیص دهد، به جای برچسبی که شما مشخص کرده اید،
_UNKNOWN
ثبت می کند. - نام کلاس یا متد را به صورت برنامه نویسی دریافت نکنید، برای مثال با فراخوانی
getName()
. اگر سعی کنید نام را به صورت برنامه نویسی دریافت کنید، ممکن است توسط ابزارهایی مانند Proguard مبهم شود. به جای آن از یک رشته رمزگذاری شده استفاده کنید. - شمارنده یا شناسههای منحصربهفرد را به برچسبهای wake lock اضافه نکنید. کدی که wake lock ایجاد می کند باید هر بار که اجرا می شود از یک برچسب استفاده کند. این تمرین سیستم را قادر میسازد تا میزان استفاده از Wake lock هر روش را جمعآوری کند.
مطمئن شوید که برنامه شما در پیش زمینه قابل مشاهده است
در حالی که Wake lock فعال است، دستگاه در حال استفاده از برق است. کاربر دستگاه باید آگاه باشد که این در حال انجام است. به همین دلیل، اگر از wake lock استفاده می کنید، باید اعلان هایی را به کاربر نمایش دهید. در عمل، این بدان معناست که شما باید wakelock را در یک سرویس پیشزمینه دریافت کرده و نگه دارید. خدمات پیش زمینه برای نمایش اعلان مورد نیاز است.
اگر یک سرویس پیش زمینه انتخاب مناسبی برای برنامه شما نیست، احتمالاً نباید از wake lock نیز استفاده کنید. به اسناد انتخاب API مناسب برای بیدار نگه داشتن دستگاه برای سایر روش های انجام کار در حالی که برنامه شما در پیش زمینه نیست، مراجعه کنید.
منطق را ساده نگه دارید
مطمئن شوید که منطق به دست آوردن و آزاد کردن wake lock تا حد امکان ساده است. وقتی منطق wake lock شما به ماشینهای حالت پیچیده، زمانبندیها، مخزنهای اجرایی یا رویدادهای برگشتی مرتبط است، هر گونه اشکال ظریف در آن منطق میتواند باعث شود که wake lock بیشتر از حد انتظار نگه داشته شود. تشخیص و رفع اشکال این باگ ها دشوار است.
بررسی کنید که wake lock همیشه آزاد باشد
اگر از wake lock استفاده می کنید، باید مطمئن شوید که هر wake lockی که به دست می آورید به درستی آزاد شده است. این همیشه آنطور که به نظر می رسد آسان نیست. برای مثال کد زیر مشکل دارد:
کاتلین
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
acquire()
doTheWork() // can potentially throw MyException
release() // does not run if an exception is thrown
}
}
جاوا
void doSomethingAndRelease() throws MyException {
wakeLock.acquire();
doTheWork(); // can potentially throw MyException
wakeLock.release(); // does not run if an exception is thrown
}
مشکل اینجاست که متد doTheWork()
میتواند استثنا MyException
ایجاد کند. اگر چنین شود، متد doSomethingAndRelease()
استثنا را به بیرون منتشر می کند و هرگز به فراخوانی release()
نمی رسد. نتیجه این است که wake lock به دست می آید اما آزاد نمی شود که بسیار بد است.
در کد تصحیح شده، doSomethingAndRelease()
مطمئن می شود که wake lock را آزاد می کند حتی اگر یک استثنا پرتاب شود:
کاتلین
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
try {
acquire()
doTheWork()
} finally {
release()
}
}
}
جاوا
void doSomethingAndRelease() throws MyException {
try {
wakeLock.acquire();
doTheWork();
} finally {
wakeLock.release();
}
}