استفاده از مکان را برای عمر باتری بهینه کنید

برای بهبود تأثیر برنامه خود بر عمر باتری دستگاه هنگام استفاده از سرویس‌های موقعیت مکانی، اقدامات زیر را انجام دهید.

حذف به‌روزرسانی‌های مکان

یکی از دلایل رایج تخلیه غیرضروری باتری، عدم حذف به‌روزرسانی‌های موقعیت مکانی در مواقعی است که دیگر نیازی به آنها نیست.

این اتفاق زمانی می‌افتد که متدهای چرخه حیات onStart() یا onResume() یک اکتیویتی شامل فراخوانی requestlocationUpdates() باشند، بدون اینکه فراخوانی متناظر removeLocationUpdates() در متدهای چرخه حیات onPause() یا onStop() داشته باشد.

شما می‌توانید از کامپوننت‌های آگاه از چرخه حیات برای مدیریت بهتر چرخه حیات اکتیویتی‌ها در برنامه خود استفاده کنید. برای اطلاعات بیشتر، به بخش «مدیریت چرخه حیات با کامپوننت‌های آگاه از چرخه حیات» مراجعه کنید.

تنظیم زمان‌های استراحت

برای جلوگیری از تخلیه باتری، یک زمان‌بندی معقول برای توقف به‌روزرسانی‌های موقعیت مکانی تعیین کنید. این زمان‌بندی تضمین می‌کند که به‌روزرسانی‌ها به طور نامحدود ادامه پیدا نکنند و در مواردی که به‌روزرسانی‌ها درخواست می‌شوند اما حذف نمی‌شوند (مثلاً به دلیل وجود اشکال در کد)، از برنامه محافظت می‌کند.

برای درخواست ارائه دهنده مکان ادغام شده، با فراخوانی setDurationMillis() یک timeout اضافه کنید، که پارامتری را دریافت می‌کند که زمان را بر حسب میلی ثانیه از آخرین فراخوانی متد نشان می‌دهد. همچنین می‌توانید از این متد برای بیان زمان انقضا بر حسب مدت زمان استفاده کنید.

برای اضافه کردن یک timeout به درخواست موقعیت مکانی geofence، متد setExpirationDuration() را فراخوانی کنید.

درخواست‌های دسته‌ای

برای همه موارد استفاده غیر پیش‌زمینه، چندین درخواست را با هم دسته بندی کنید. از متد setIntervalMillis() برای مشخص کردن بازه زمانی که می‌خواهید مکان در آن محاسبه شود استفاده کنید. سپس، از متد setMaxUpdateDelayMillis() برای تنظیم بازه زمانی که مکان به برنامه شما تحویل داده می‌شود استفاده کنید. مقداری را به متد setMaxUpdateDelayMillis() ارسال کنید که مضربی از مقدار ارسالی به متد setIntervalMillis() باشد. برای مثال، درخواست مکان زیر را در نظر بگیرید:

کاتلین

val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
.setMaxUpdateDelayMillis(60 * 60 * 1000)
.build()

جاوا

LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
    .setMaxUpdateDelayMillis(60 * 60 * 1000)
    .build();

در این حالت، سیستم تقریباً هر ده دقیقه یک بار موقعیت مکانی را محاسبه می‌کند و تقریباً هر ساعت شش نقطه داده مکانی را به صورت دسته‌ای ارائه می‌دهد. در حالی که شما هنوز هر ده دقیقه یا بیشتر به‌روزرسانی‌های موقعیت مکانی را دریافت می‌کنید، باتری را ذخیره می‌کنید زیرا دستگاه شما فقط هر یک ساعت یا بیشتر از حالت آماده به کار خارج می‌شود.

از به‌روزرسانی‌های غیرفعال موقعیت مکانی استفاده کنید

در موارد استفاده در پس‌زمینه، ایده خوبی است که به‌روزرسانی‌های موقعیت مکانی را محدود کنید. اندروید ۸.۰ (سطح API ۲۶) این رویه را محدود می‌کند، اما برنامه‌هایی که روی دستگاه‌های پایین‌تر اجرا می‌شوند باید تا حد امکان موقعیت مکانی پس‌زمینه را محدود کنند.

این احتمال وجود دارد که در حالی که برنامه شما در پس‌زمینه است، برنامه دیگری مرتباً درخواست به‌روزرسانی موقعیت مکانی را در پیش‌زمینه داشته باشد. سرویس‌های موقعیت مکانی این به‌روزرسانی‌ها را در دسترس برنامه شما قرار می‌دهند. درخواست موقعیت مکانی زیر را در نظر بگیرید که به طور فرصت‌طلبانه‌ای داده‌های موقعیت مکانی را مصرف می‌کند:

کاتلین

val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
.setMinUpdateIntervalMillis(2 * 60 * 1000)
.build()

جاوا

LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
    .setMinUpdateIntervalMillis(2 * 60 * 1000)
    .build();

در مثال قبلی، موقعیت مکانی برنامه تقریباً هر ۱۵ دقیقه محاسبه می‌شود. اگر برنامه‌های دیگر درخواست موقعیت مکانی کنند، برنامه داده‌ها را حداکثر در فاصله دو دقیقه دریافت می‌کند.

اگرچه مصرف غیرفعال اطلاعات موقعیت مکانی هیچ گونه تخلیه باتری ایجاد نمی‌کند، اما در مواردی که دریافت داده‌های موقعیت مکانی باعث افزایش مصرف CPU یا عملیات ورودی/خروجی می‌شود، احتیاط بیشتری کنید. برای به حداقل رساندن هزینه‌های باتری، بازه زمانی مشخص شده در setMinUpdateIntervalMillis() نباید خیلی کوچک باشد.