با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
استفاده از 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)fundoSomethingAndRelease(){wakeLock.apply{acquire()doTheWork()// can potentially throw MyExceptionrelease()// does not run if an exception is thrown}}
جاوا
voiddoSomethingAndRelease()throwsMyException{wakeLock.acquire();doTheWork();// can potentially throw MyExceptionwakeLock.release();// does not run if an exception is thrown}
مشکل اینجاست که متد doTheWork() میتواند استثنا MyException ایجاد کند. اگر چنین شود، متد doSomethingAndRelease() استثنا را به بیرون منتشر می کند و هرگز به فراخوانی release() نمی رسد. نتیجه این است که wake lock به دست می آید اما آزاد نمی شود که بسیار بد است.
در کد تصحیح شده، doSomethingAndRelease() مطمئن می شود که wake lock را آزاد می کند حتی اگر یک استثنا پرتاب شود:
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-08-27 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-08-27 بهوقت ساعت هماهنگ جهانی."],[],[],null,["Using a wake lock can impair device performance. If you need to use a wake\nlock, it's important to do it properly. This document covers some best practices\nthat can help you avoid common wake lock pitfalls.\n| **Note:** Creating and holding wake locks can have a dramatic impact on the device's battery life. You shouldn't use wake locks if there are any suitable alternatives. For other options, see the [Keep the device awake](/develop/background-work/background-tasks/awake) documentation. If you do need to use a wake lock, make sure to hold it for as short a time as possible.\n\nName the wake lock properly\n\nWe recommend including your package, class, or method name in the wakelock\ntag. That way, if an error occurs, it's easier to find the location in your\nsource code where the wake lock was created. Here are some additional tips:\n\n- Leave out any personally identifying information (PII) in the name, such as an email address. If the device detects PII in the wake lock tag, it logs `_UNKNOWN` instead of the tag you specified.\n- Don't get the class or method name programmatically, for example by calling `getName()`. If you try to get the name programmatically, it might get obfuscated by tools like Proguard. Instead use a hard-coded string.\n- Don't add a counter or unique identifiers to wake lock tags. The code that creates a wake lock should use the same tag every time it runs. This practice enables the system to aggregate each method's wake lock usage.\n\nMake sure your app is visible in the foreground\n\nWhile a wake lock is active, the device is using power. The device's user\nshould be aware that this is going on. For this reason, if you're using a\nwake lock, you should display some notification to the user.\nIn practice, this means you should get and hold the wakelock in a\n[foreground service](/develop/background-work/services/fgs). Foreground services are required to display\na notification.\n\nIf a foreground service isn't the right choice for your app,\nyou probably shouldn't be using a wake lock, either. See the\n[Choose the right API to keep the device awake](/develop/background-work/background-tasks/awake)\ndocumentation for other ways to do work while your app isn't in the foreground.\n\nKeep the logic simple\n\nMake sure the logic for acquiring and releasing wake locks is as simple as\npossible. When your wake lock logic is tied to complex state machines, timeouts,\nexecutor pools, or callback events, any subtle bug in that logic can cause the\nwake lock to be held longer than expected. These bugs are difficult to diagnose\nand debug.\n\nCheck that the wake lock is always released\n\nIf you use a wake lock, you must make sure that every wake lock you acquire\nis properly released. This isn't always as easy as it sounds. For example,\nthe following code has a problem: \n\nKotlin \n\n @Throws(MyException::class)\n fun doSomethingAndRelease() {\n wakeLock.apply {\n acquire()\n doTheWork() // can potentially throw MyException\n release() // does not run if an exception is thrown\n }\n }\n\nJava \n\n void doSomethingAndRelease() throws MyException {\n wakeLock.acquire();\n doTheWork(); // can potentially throw MyException\n wakeLock.release(); // does not run if an exception is thrown\n }\n\nThe problem here is that the method `doTheWork()` can throw the exception\n`MyException`. If it does, the `doSomethingAndRelease()` method propagates\nthe exception outward, and it never reaches the `release()` call. The result\nis that the wake lock is acquired but not released, which is very bad.\n\nIn the corrected code, `doSomethingAndRelease()` makes sure to release the\nwake lock even if an exception is thrown: \n\nKotlin \n\n @Throws(MyException::class)\n fun doSomethingAndRelease() {\n wakeLock.apply {\n try {\n acquire()\n doTheWork()\n } finally {\n release()\n }\n }\n }\n\nJava \n\n void doSomethingAndRelease() throws MyException {\n try {\n wakeLock.acquire();\n doTheWork();\n } finally {\n wakeLock.release();\n }\n }"]]