مکان را برای باتری بهینه کنید

محدودیت‌های موقعیت مکانی در پس‌زمینه معرفی‌شده در Android 8.0 (سطح API 26) تمرکز جدیدی را روی موضوع تأثیر استفاده از سرویس‌های موقعیت مکانی بر تخلیه باتری آورده است. این صفحه به برخی از بهترین شیوه‌های خدمات موقعیت مکانی و کارهایی که اکنون می‌توانید برای کارآمدتر کردن باتری برنامه‌هایتان انجام دهید، می‌پردازد. به کارگیری این بهترین شیوه ها صرف نظر از نسخه پلتفرمی که روی آن اجرا می شود به نفع برنامه شماست.

محدودیت‌های موقعیت مکانی پس‌زمینه در اندروید 8.0 تغییرات زیر را ایجاد کرد:

  • جمع‌آوری مکان پس‌زمینه کاهش می‌یابد و مکان محاسبه می‌شود و تنها چند بار در ساعت تحویل داده می‌شود.
  • اسکن‌های Wi-Fi محافظه‌کارانه‌تر هستند و زمانی که دستگاه به همان نقطه دسترسی ثابت متصل می‌ماند، به‌روزرسانی‌های مکان محاسبه نمی‌شوند.
  • پاسخگویی Geofencing از ده ها ثانیه به تقریباً دو دقیقه تغییر می کند. این تغییر به طور قابل توجهی عملکرد باتری را بهبود می بخشد—تا 10 برابر در برخی دستگاه ها بهتر است.

این صفحه فرض می‌کند که از APIهای Google Location Services استفاده می‌کنید که دقت بالاتری را ارائه می‌دهند و بار باتری سبک‌تری نسبت به APIهای مکان چارچوب ایجاد می‌کنند. به طور خاص، این صفحه فرض آشنایی با API ارائه‌دهنده مکان ترکیبی را دارد که سیگنال‌های GPS، Wi-Fi، و شبکه‌های سلولی و همچنین شتاب‌سنج، ژیروسکوپ، مغناطیس‌سنج و سایر حسگرها را ترکیب می‌کند. همچنین باید با geofencing API آشنا باشید، که در بالای API ارائه‌دهنده مکان ترکیبی ساخته شده است و برای عملکرد باتری بهینه شده است.

تخلیه باتری را درک کنید

جمع آوری مکان و تخلیه باتری از جنبه های زیر مستقیماً مرتبط هستند:

  • دقت: دقت داده های مکان. به طور کلی، هرچه دقت بالاتر باشد، تخلیه باتری بیشتر است.
  • فرکانس: هر چند وقت یکبار مکان محاسبه می شود. هر چه مکان مکرر محاسبه شود، باتری بیشتری مصرف می شود.
  • تأخیر: اطلاعات مکان با چه سرعتی تحویل داده می شود. تأخیر کمتر معمولاً به باتری بیشتری نیاز دارد.

دقت

می توانید دقت مکان را با استفاده از متد setPriority() مشخص کنید و یکی از مقادیر زیر را به عنوان آرگومان ارسال کنید:

  • PRIORITY_HIGH_ACCURACY دقیق ترین مکان ممکن را ارائه می دهد که با استفاده از ورودی های مورد نیاز محاسبه می شود (GPS، Wi-Fi و سلول را فعال می کند و از انواع سنسورها استفاده می کند) و ممکن است باعث تخلیه قابل توجه باتری شود.
  • PRIORITY_BALANCED_POWER_ACCURACY موقعیت مکانی دقیق را در عین بهینه سازی برای قدرت فراهم می کند. به ندرت از GPS استفاده می کند. معمولاً از ترکیبی از Wi-Fi و اطلاعات سلولی برای محاسبه مکان دستگاه استفاده می کند.
  • PRIORITY_LOW_POWER تا حد زیادی به دکل‌های سلولی متکی است و از ورودی‌های GPS و Wi-Fi اجتناب می‌کند و دقت درشت (در سطح شهر) را با حداقل تخلیه باتری ارائه می‌کند.
  • PRIORITY_NO_POWER مکان ها را به صورت غیرفعال از برنامه های دیگر دریافت می کند که مکان قبلاً برای آنها محاسبه شده است.

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

فرکانس

می توانید فرکانس مکان را با استفاده از دو روش مشخص کنید:

  • از متد setinterval() برای تعیین فاصله زمانی که مکان برای برنامه شما محاسبه می شود استفاده کنید.
  • از setFastestInterval() برای تعیین فاصله زمانی که مکان محاسبه شده برای سایر برنامه ها به برنامه شما تحویل داده می شود، استفاده کنید.

هنگام استفاده از setInterval() باید بزرگترین مقدار ممکن را ارسال کنید. این امر به ویژه برای جمع آوری موقعیت مکانی پس زمینه، که اغلب منبع تخلیه ناخواسته باتری است، صادق است. استفاده از فواصل چند ثانیه ای باید برای موارد استفاده پیش زمینه در نظر گرفته شود. محدودیت‌های موقعیت مکانی پس‌زمینه معرفی‌شده در Android 8.0 این استراتژی‌ها را اعمال می‌کنند، اما برنامه شما باید تلاش کند تا آن‌ها را در دستگاه‌های Android 7.0 یا پایین‌تر اعمال کند.

تأخیر

شما می توانید تاخیر را با استفاده از متد setMaxWaitTime() تعیین کنید، معمولا مقداری را ارسال می کند که چندین برابر بیشتر از فاصله مشخص شده در متد setInterval() است. این تنظیم تحویل مکان را به تأخیر می‌اندازد و ممکن است چندین به‌روزرسانی مکان به صورت دسته‌ای ارائه شود. این دو تغییر به کاهش مصرف باتری کمک می کند.

اگر برنامه شما فوراً به به‌روزرسانی موقعیت مکانی نیاز ندارد، باید بیشترین مقدار ممکن را به متد setMaxWaitTime() منتقل کنید و به طور مؤثر تاخیر را برای داده‌ها و کارایی باتری بیشتر معامله کنید.

هنگام استفاده از geofences، برنامه ها باید مقدار زیادی را به متد setNotificationResponsiveness() ارسال کنند تا قدرت حفظ شود. مقدار پنج دقیقه یا بیشتر توصیه می شود.

موارد استفاده از مکان

این بخش برخی از سناریوهای جمع‌آوری مکان معمولی را به همراه توصیه‌هایی برای استفاده بهینه از APIهای ارائه‌دهنده مکان‌یابی جغرافیایی و ترکیبی توضیح می‌دهد.

به روز رسانی های قابل مشاهده یا پیش زمینه کاربر

مثال: یک برنامه نقشه برداری که به به روز رسانی های مکرر و دقیق با تأخیر بسیار کم نیاز دارد. همه به‌روزرسانی‌ها در پیش‌زمینه اتفاق می‌افتند: کاربر یک فعالیت را شروع می‌کند، داده‌های مکان را مصرف می‌کند و سپس پس از مدت کوتاهی فعالیت را متوقف می‌کند.

از متد setPriority() با مقدار PRIORITY_HIGH_ACCURACY یا PRIORITY_BALANCED_POWER_ACCURACY استفاده کنید.

فاصله مشخص شده در متد setInterval() بستگی به مورد استفاده دارد: برای سناریوهای زمان واقعی، مقدار را روی چند ثانیه تنظیم کنید. در غیر این صورت، به چند دقیقه محدود کنید (تقریباً دو دقیقه یا بیشتر برای به حداقل رساندن مصرف باتری توصیه می شود).

دانستن موقعیت مکانی دستگاه

مثال: یک برنامه هواشناسی می خواهد مکان دستگاه را بداند.

از متد getLastLocation() استفاده کنید که جدیدترین مکان موجود (که در موارد نادر ممکن است خالی باشد) را برمی گرداند. این روش روشی ساده برای دریافت موقعیت مکانی ارائه می دهد و هزینه های مرتبط با درخواست فعالانه به روز رسانی مکان را متحمل نمی شود. در ارتباط با متد isLocationAvailable() استفاده کنید، که وقتی موقعیت مکانی که توسط getLastLocation() به طور معقولی به روز باشد، true برمی گرداند.

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

مثال: درخواست به‌روزرسانی زمانی که کاربر در فاصله معینی از محل کار، خانه یا مکان دیگری است.

از geofencing در ارتباط با به‌روزرسانی‌های ارائه‌دهنده مکان ترکیبی استفاده کنید. زمانی که برنامه ماشه ورودی geofence را دریافت می کند، درخواست به روز رسانی کنید و زمانی که برنامه ماشه خروج geofence را دریافت می کند، به روز رسانی ها را حذف کنید. این تضمین می کند که برنامه تنها زمانی که کاربر وارد یک منطقه تعریف شده شده باشد، به روز رسانی های مکان دقیق تری دریافت می کند.

گردش کار معمولی برای این سناریو می‌تواند شامل نمایان شدن یک اعلان پس از انتقال geofence و راه‌اندازی فعالیتی باشد که حاوی کدی برای درخواست به‌روزرسانی زمانی است که کاربر روی اعلان ضربه می‌زند.

شروع به روز رسانی بر اساس وضعیت فعالیت کاربر

مثال: درخواست به‌روزرسانی فقط زمانی که کاربر در حال رانندگی یا دوچرخه‌سواری است.

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

گردش کار معمولی برای این مورد استفاده می‌تواند شامل نمایش یک اعلان برای فعالیت شناسایی‌شده و راه‌اندازی فعالیتی باشد که حاوی کدی برای درخواست به‌روزرسانی زمانی است که کاربر روی اعلان ضربه می‌زند.

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

مثال: کاربر می خواهد زمانی که دستگاه در نزدیکی یک خرده فروش قرار دارد به او اطلاع داده شود.

این یک مورد استفاده عالی برای geofencing است. از آنجا که استفاده تقریباً به طور قطع شامل مکان پس‌زمینه است، از روش addGeofences(GeofencingRequest, PendingIntent) استفاده کنید.

شما باید گزینه های پیکربندی زیر را تنظیم کنید:

  • اگر در حال ردیابی انتقال های ساکن هستید، از متد setLoiteringDelay() استفاده کنید که مقدار تقریباً پنج دقیقه یا کمتر را ارسال می کند.

  • از setNotificationResponsiveness() استفاده کنید و مقدار تقریباً پنج دقیقه را ارسال کنید. با این حال، اگر برنامه شما می تواند تاخیر اضافی در پاسخگویی را مدیریت کند، از مقدار تقریباً ده دقیقه استفاده کنید.

یک برنامه تنها می‌تواند حداکثر 100 geofences را در یک زمان ثبت کند. در یک مورد استفاده که یک برنامه می‌خواهد تعداد زیادی از گزینه‌های خرده‌فروش را ردیابی کند، ممکن است برنامه بخواهد geofence‌های بزرگ (در سطح شهر) را ثبت کند و به صورت پویا ژئوفنس‌های کوچک‌تر (برای مکان‌های داخل شهر) را برای فروشگاه‌های درون geofence بزرگ‌تر ثبت کند. هنگامی که کاربر وارد یک geofence بزرگ می شود، می توان geofence های کوچکتر را اضافه کرد. هنگامی که کاربر از geofence بزرگتر خارج می شود، geofence های کوچکتر می توانند حذف شوند و geofence ها می توانند دوباره برای یک منطقه جدید ثبت شوند.

به‌روزرسانی‌های طولانی مدت موقعیت مکانی پس‌زمینه بدون یک جزء برنامه قابل مشاهده

مثال: برنامه ای که به صورت غیر فعال مکان را ردیابی می کند

در صورت امکان از متد setPriority() با گزینه PRIORITY_NO_POWER استفاده کنید زیرا تقریباً هیچ باتری تخلیه نمی شود. اگر استفاده از PRIORITY_NO_POWER ممکن نیست، از PRIORITY_BALANCED_POWER_ACCURACY یا PRIORITY_LOW_POWER استفاده کنید، اما از استفاده از PRIORITY_HIGH_ACCURACY برای کار در پس‌زمینه پایدار اجتناب کنید زیرا این گزینه به طور قابل‌توجهی باتری را تخلیه می‌کند.

اگر به داده های مکان بیشتری نیاز دارید، با فراخوانی متد setFastestInterval() و ارسال مقداری کوچکتر از آنچه به setInterval() ارسال می کنید، از موقعیت غیرفعال استفاده کنید. وقتی با گزینه PRIORITY_NO_POWER ترکیب می‌شود، موقعیت مکانی غیرفعال می‌تواند موقعیت مکانی را که توسط برنامه‌های دیگر محاسبه می‌شود، بدون هزینه اضافی ارائه دهد.

فرکانس را با اضافه کردن مقداری تأخیر، با استفاده از متد setMaxWaitTime() تعدیل کنید. برای مثال، اگر از متد setinterval() با مقدار تقریباً 10 دقیقه استفاده می‌کنید، باید setMaxWaitTime() با مقداری بین 30 تا 60 دقیقه فراخوانی کنید. با استفاده از این گزینه‌ها، مکان برای برنامه شما تقریباً هر 10 دقیقه محاسبه می‌شود، اما برنامه فقط هر 30 تا 60 دقیقه با برخی از داده‌های موقعیت مکانی در دسترس به‌عنوان یک به‌روزرسانی دسته‌ای، بیدار می‌شود. این رویکرد تاخیر را با داده های بیشتر در دسترس و عملکرد باتری بهتر معامله می کند.

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

مثال: یک برنامه ناوبری یا تناسب اندام که وقتی کاربر صفحه را خاموش می کند یا برنامه دیگری را باز می کند به کار خود ادامه می دهد.

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

بهترین شیوه های مکان یابی

اجرای بهترین روش ها در این بخش به کاهش مصرف باتری اپلیکیشن شما کمک می کند.

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

یکی از منابع رایج تخلیه غیر ضروری باتری، عدم حذف به‌روزرسانی‌های مکان در زمانی است که دیگر مورد نیاز نیستند. به عنوان مثال، زمانی که متدهای چرخه حیات onStart() یا onResume() یک اکتیویتی حاوی فراخوانی به requestlocationUpdates() بدون فراخوانی مربوطه به removeLocationUpdates() در متدهای چرخه عمر onPause() یا onStop() باشد، این اتفاق می افتد.

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

زمان‌بندی را تنظیم کنید

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

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

برای افزودن یک بازه زمانی به درخواست مکان جغرافیایی، متد setExpirationDuration() فراخوانی کنید.

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

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

کاتلین

val request = LocationRequest()
request.setInterval(10 * 60 * 1000)
request.setMaxWaitTime(60 * 60 * 1000)

جاوا

LocationRequest request = new LocationRequest();
request.setInterval(10 * 60 * 1000);
request.setMaxWaitTime(60 * 60 * 1000);

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

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

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

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

کاتلین

val request = LocationRequest()
request.setInterval(15 * 60 * 1000)
request.setFastestInterval(2 * 60 * 1000)

جاوا

LocationRequest request = new LocationRequest();
request.setInterval(15 * 60 * 1000);
request.setFastestInterval(2 * 60 * 1000);

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

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

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