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

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

برداشتن به‌روزرسانی‌های مکان

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

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

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

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

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

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

برای افزودن زمان استراحت به درخواست مکان حصار جغرافیایی، روش 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();

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

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

در موارد استفاده در پس‌زمینه، بهتر است به‌روزرسانی‌های مکان را محدود کنید. محدودیت‌های Android نسخه ۸.۰ (سطح 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 یا I/O می‌شود، دقت بیشتری داشته باشید. برای به‌حداقل رساندن مصرف باتری، بازه زمانی مشخص‌شده در setMinUpdateIntervalMillis() نباید خیلی کوتاه باشد.