バッテリー駆動時間を重視した位置情報の使用を最適化する
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
位置情報サービスを使用しているときにアプリがデバイスのバッテリー寿命に及ぼす影響を改善するには、次の操作を行います。
位置情報の更新データを削除する
必要のない電池消費の一般的な原因として、不要になった位置情報の更新データの削除に失敗するケースがあります。
この問題が発生するのは、たとえば、アクティビティの onStart()
または onResume()
ライフサイクル メソッドに requestlocationUpdates()
の呼び出しが含まれているが、対応する removeLocationUpdates()
の呼び出しが onPause()
または onStop()
ライフサイクル メソッドに含まれていない場合です。
ライフサイクル対応コンポーネントを使用すると、アプリ内のアクティビティのライフサイクルをより適切に管理できます。詳細については、ライフサイクル対応コンポーネントによるライフサイクルへの対応をご覧ください。
タイムアウトを設定する
電池の消耗を防ぐには、位置情報の更新を停止すべき時点に適切なタイムアウトを設定します。タイムアウトにより、更新が果てしなく続くことがなくなり、(コードのバグなどが原因で)リクエストされた更新データが削除されなかった場合にアプリが保護されます。
融合された位置予測プロバイダのリクエストの場合は、setDurationMillis()
を呼び出してタイムアウトを追加します。このメソッドは、メソッドが最後に呼び出された時点からの経過時間をミリ秒単位で表すパラメータを受け取ります。このメソッドを使用して、有効期限を時間単位で表すこともできます。
ジオフェンスの位置情報リクエストにタイムアウトを追加するには、setExpirationDuration()
メソッドを呼び出します。
バッチ リクエスト
フォアグラウンドのユースケースを除くすべてのユースケースでは、複数のリクエストをまとめてバッチで処理します。setIntervalMillis()
メソッドを使用して、位置情報を計算する間隔を指定します。次に、setMaxUpdateDelayMillis()
メソッドを使用して、位置情報をアプリに配信する間隔を設定します。setMaxUpdateDelayMillis()
メソッドに渡す値は、setIntervalMillis()
メソッドに渡す値の倍数でなければなりません。たとえば、次の位置情報リクエストについて考えてみます。
Kotlin
val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
.setMaxUpdateDelayMillis(60 * 60 * 1000)
.build()
Java
LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
.setMaxUpdateDelayMillis(60 * 60 * 1000)
.build();
この場合、システムは約 10 分ごとに位置情報を計算し、約 1 時間ごとに約 6 個の位置情報データポイントをバッチで配信します。位置情報の更新データは約 10 分ごとに取得されますが、デバイスは約 1 時間ごとにウェイクアップするので、電池を節約できます。
パッシブな位置情報の更新を利用する
バックグラウンドのユースケースでは、位置情報の更新をスロットリングすることをおすすめします。このおすすめの方法は Android 8.0(API レベル 26)の制限に伴って必須になりましたが、それより古いデバイスで実行されるアプリでも、可能な限りバックグラウンド位置情報を制限するように努める必要があります。
自分のアプリがバックグラウンドで実行されているときに、別のアプリがフォアグラウンドで頻繁に位置情報の更新データをリクエストする場合があります。位置情報サービスにより、この更新データを自分のアプリで使用できます。他のアプリの位置情報データを利用する以下の位置情報リクエストの使用を検討してください。
Kotlin
val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
.setMinUpdateIntervalMillis(2 * 60 * 1000)
.build()
Java
LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
.setMinUpdateIntervalMillis(2 * 60 * 1000)
.build();
前の例では、アプリの位置情報は約 15 分ごとに計算されます。他のアプリが位置情報をリクエストした場合、アプリは最大 2 分間隔でデータを受信します。
パッシブな位置情報を利用する場合、電池の消耗は発生しませんが、位置情報データの受信によって負荷の高い CPU オペレーションまたは I/O オペレーションが発生するケースがあるため、その点にも注意する必要があります。電池のコストを最小限に抑えるには、setMinUpdateIntervalMillis()
に短すぎる間隔を指定しないようにします。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-07-27 UTC。
[[["わかりやすい","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-07-27 UTC。"],[],[],null,["# Optimize location use for battery life\n\nTake the following actions to [improve your app's\nimpact on a device's battery life](/develop/sensors-and-location/location/battery) when using location services.\n\nRemove location updates\n-----------------------\n\nA common source of unnecessary battery drain is the failure to remove location\nupdates when they are no longer needed.\n\nThis can happen when an activity's [`onStart()`](/reference/android/app/Activity#onStart()) or [`onResume()`](/reference/android/app/Activity#onResume())\nlifecycle methods contain a call to [`requestlocationUpdates()`](https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient#requestLocationUpdates(com.google.android.gms.location.LocationRequest,%20android.app.PendingIntent)) without a\ncorresponding call to [`removeLocationUpdates()`](https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient.html#removeLocationUpdates(com.google.android.gms.location.LocationCallback)) in the [`onPause()`](/reference/android/app/Activity#onPause()) or\n[`onStop()`](/reference/android/app/Activity#onStop()) lifecycle methods.\n\nYou can use lifecycle-aware components to better manage the lifecycle of the\nactivities in your app. For more information, see [Handling Lifecycles with\nLifecycle-Aware Components](/topic/libraries/architecture/lifecycle).\n\nSet timeouts\n------------\n\nTo guard against battery drain, set a reasonable timeout when location updates\nshould stop. The timeout ensures that updates don't continue indefinitely, and\nit protects the app in scenarios where updates are requested but not removed\n(for example, because of a bug in the code).\n\nFor a fused location provider request, add a timeout by calling\n[`setDurationMillis()`](https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.Builder#setDurationMillis(long)), which receives a parameter that represents the\ntime in milliseconds since the method was last called. You can also use the\nmethod to express the expiration time in terms of duration.\n\nTo add a timeout to a geofence location request, call the\n[`setExpirationDuration()`](https://developers.google.com/android/reference/com/google/android/gms/location/Geofence.Builder.html#setExpirationDuration(long)) method.\n\nBatch requests\n--------------\n\nFor all non-foreground use cases, batch multiple requests together. Use the\n[`setIntervalMillis()`](https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.Builder#setIntervalMillis(long)) method to specify the interval at which you would like\nlocation to be computed. Then, use the [`setMaxUpdateDelayMillis()`](https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.Builder#setMaxUpdateDelayMillis(long)) method to set\nthe interval at which location is *delivered* to your app. Pass a value to the\n`setMaxUpdateDelayMillis()` method that is a multiple of the value passed to the\n`setIntervalMillis()` method. For example, consider the following location request: \n\n### Kotlin\n\n val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)\n .setMaxUpdateDelayMillis(60 * 60 * 1000)\n .build()\n\n### Java\n\n LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)\n .setMaxUpdateDelayMillis(60 * 60 * 1000)\n .build();\n\nIn this case, the system computes location roughly every ten minutes and\ndelivers approximately six location data points in a batch approximately every\nhour. While you still get location updates every ten minutes or so, you conserve\nbattery because your device wakes up only every hour or so.\n\nUse passive location updates\n----------------------------\n\nIn background use cases, it is a good idea to throttle location updates. Android\n8.0 (API level 26) limits enforce this practice, but apps running on lower\ndevices should strive to limit background location as much as possible.\n\nIt is likely that while your app is in the background, another app may be\nfrequently requesting location updates in the foreground. Location services\nmakes these updates available to your app. Consider the following location\nrequest, which opportunistically consumes location data: \n\n### Kotlin\n\n val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)\n .setMinUpdateIntervalMillis(2 * 60 * 1000)\n .build()\n\n### Java\n\n LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)\n .setMinUpdateIntervalMillis(2 * 60 * 1000)\n .build();\n\nIn the previous example, the app's location computes roughly every 15 minutes.\nIf other apps request location, the app receives the data at a maximum interval\nof two minutes.\n\nWhile consuming location passively incurs no battery drain, take extra care in\ncases where the receipt of location data triggers expensive CPU or I/O\noperations. To minimize battery costs, the interval specified in\n[`setMinUpdateIntervalMillis()`](https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.Builder#public-locationrequest.builder-setmaxupdateagemillis-long-maxupdateagemillis(long)) shouldn't be too small."]]