برای جلوگیری از تخلیه باتری، دستگاه اندرویدی که بیکار مانده است، به سرعت به خواب می رود. با این حال، مواقعی وجود دارد که یک برنامه باید صفحه یا CPU را بیدار کند و آن را بیدار نگه دارد تا کار انجام شود.
رویکرد شما بستگی به نیازهای برنامه شما دارد. با این حال، یک قانون کلی این است که شما باید از سبک ترین رویکرد ممکن برای برنامه خود استفاده کنید تا تأثیر برنامه خود را بر منابع سیستم به حداقل برسانید. بخشهای زیر نحوه رسیدگی به مواردی را که رفتار خواب پیشفرض دستگاه با الزامات برنامه شما ناسازگار است، شرح میدهد.
جایگزین های استفاده از ویک لاک
قبل از افزودن پشتیبانی wakelock به برنامه خود، در نظر بگیرید که آیا موارد استفاده برنامه شما یکی از راه حل های جایگزین زیر را پشتیبانی می کند یا خیر:
اگر برنامه شما بارگیری طولانی مدت HTTP را انجام می دهد، از
DownloadManager
استفاده کنید.اگر برنامه شما دادهها را از یک سرور خارجی همگامسازی میکند، یک آداپتور همگامسازی ایجاد کنید.
اگر برنامه شما به خدمات پسزمینه متکی است، از JobScheduler یا Firebase Cloud Messaging برای راهاندازی این سرویسها در فواصل زمانی خاص استفاده کنید.
اگر میخواهید برنامه همراه خود را هر زمان که دستگاه همراه در محدوده قرار دارد اجرا کنید، از Companion Device Manager استفاده کنید.
صفحه نمایش را روشن نگه دارید
برخی از برنامه ها مانند بازی ها یا برنامه های فیلم، باید صفحه نمایش را روشن نگه دارند. بهترین راه برای انجام این کار استفاده از FLAG_KEEP_SCREEN_ON
در فعالیت خود است (و فقط در یک فعالیت، هرگز در یک سرویس یا سایر اجزای برنامه). به عنوان مثال:
کاتلین
class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } }
جاوا
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } }
مزیت این روش این است که برخلاف wake lock (که در مورد روشن نگه داشتن CPU بحث شد)، به مجوز خاصی نیاز ندارد و پلتفرم به درستی کاربر را در حال حرکت بین برنامهها مدیریت میکند، بدون اینکه برنامه شما نگران انتشار منابع استفاده نشده باشد.
راه دیگری برای پیاده سازی این کار در فایل XML طرح بندی برنامه شما با استفاده از ویژگی android:keepScreenOn
است:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"> ... </RelativeLayout>
استفاده از android:keepScreenOn="true"
معادل استفاده از FLAG_KEEP_SCREEN_ON
است. شما می توانید از هر رویکردی که برای برنامه شما بهترین است استفاده کنید. مزیت تنظیم پرچم به صورت برنامهریزی در فعالیت شما این است که به شما این امکان را میدهد که پرچم را بعداً به صورت برنامهریزی پاک کنید و در نتیجه اجازه دهید صفحه نمایش خاموش شود.
حالت محیطی برای تلویزیون
در تلویزیون، FLAG_KEEP_SCREEN_ON
باید برای جلوگیری از رفتن دستگاه به حالت محیطی در حین پخش فعال ویدیو استفاده شود. وقتی FLAG_KEEP_SCREEN_ON
توسط فعالیت پیش زمینه تنظیم نشده باشد، دستگاه به طور خودکار پس از مدتی عدم فعالیت وارد حالت محیطی می شود.
CPU را روشن نگه دارید
اگر برای انجام برخی کارها قبل از به خواب رفتن دستگاه نیاز دارید تا CPU را روشن نگه دارید، می توانید از ویژگی سرویس سیستم PowerManager
به نام wake locks استفاده کنید. Wake lock به برنامه شما اجازه می دهد تا وضعیت برق دستگاه میزبان را کنترل کند.
ایجاد و نگه داشتن wake lock می تواند تأثیر چشمگیری بر عمر باتری دستگاه میزبان داشته باشد. بنابراین شما باید از wake lock فقط در مواقع ضروری استفاده کنید و آنها را تا حد امکان کوتاه نگه دارید. به عنوان مثال، هرگز نیازی به استفاده از wake lock در یک فعالیت ندارید. همانطور که در بالا توضیح داده شد، اگر می خواهید صفحه نمایش را در فعالیت خود روشن نگه دارید، از FLAG_KEEP_SCREEN_ON
استفاده کنید.
یکی از موارد قانونی برای استفاده از wake lock ممکن است یک سرویس پسزمینه باشد که باید یک wake lock را بگیرد تا CPU در حالت خاموش بودن صفحه کار کند. با این حال، باز هم، این عمل باید به دلیل تأثیر آن بر عمر باتری به حداقل برسد.
برای استفاده از wake lock، اولین قدم این است که مجوز WAKE_LOCK
به فایل مانیفست برنامه خود اضافه کنید:
<uses-permission android:name="android.permission.WAKE_LOCK" />
اگر برنامه شما دارای یک گیرنده پخش است که از سرویسی برای انجام برخی کارها استفاده می کند، در اینجا نحوه تنظیم مستقیم قفل بیدار شدن وجود دارد:
کاتلین
val wakeLock: PowerManager.WakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).run { newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply { acquire() } }
جاوا
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); wakeLock.acquire();
برای آزاد کردن wake lock، wakelock.release()
را فراخوانی کنید. این ادعای شما را نسبت به CPU آزاد می کند. مهم است که به محض اتمام استفاده از برنامه شما، wake lock را آزاد کنید تا از تخلیه باتری جلوگیری شود.