バッテリー駆動時間を重視した位置情報の使用を最適化する

位置情報サービスを使用する際に、アプリがデバイスのバッテリー寿命に及ぼす影響を改善する には、次の操作を行います。

位置情報の更新データを削除する

必要のないバッテリーの消耗の一般的な原因として、不要になった位置情報の更新データの削除に失敗するケースがあります。

この問題が発生するのは、アクティビティの onStart() または onResume() ライフサイクル メソッドに requestlocationUpdates() の呼び出しが含まれているが、対応する removeLocationUpdates() の呼び出しが onPause() または onStop() ライフサイクル メソッドに含まれていない場合です。

ライフサイクル対応コンポーネントを使用すると、アプリ内のアクティビティのライフサイクルをより適切に管理できます。詳細については、ライフサイクル対応コンポーネントによるライフサイクルへの対応をご覧ください。

タイムアウトを設定する

電池の消耗を防ぐには、位置情報の更新を停止すべき時点に適切なタイムアウトを設定します。タイムアウトにより、更新が果てしなく続くことがなくなり、(コードのバグなどが原因で)リクエストされた更新データが削除されなかった場合にアプリが保護されます。

Fused Location Provider のリクエストの場合は、 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() に短すぎる間隔を指定しないようにします。