バックグラウンドでの位置情報の使用は、バッテリー駆動時間に大きな影響を与える可能性があります。Android は、バックグラウンドでの位置情報の収集を制限し、デベロッパーがバッテリー効率を高めるためにアプリを最適化するよう促します。これらの最適化は、実行している Android バージョンに関係なく、すべてのデバイスにメリットがあります。
- バックグラウンドでの位置情報の収集はスロットリングされ、位置情報の計算と配信は 1 時間あたり数回のみになります。
- Wi-Fi スキャンは頻度が減少し、デバイスが同一の静的アクセス ポイントへの接続を維持しているときは位置情報の更新データが計算されません。
- ジオフェンスの応答性が数十秒から約 2 分に変更されました。この変更により、電池のパフォーマンスが向上し、デバイスによっては最大 10 倍になります。
必要な知識
このドキュメントは、次の API に精通していることを前提としています。
- Google 位置情報サービス。これらの API はフレームワーク位置情報 API よりも精度が高く、電池の消費量を軽減する効果があります。
- Fused Location Provider:この API は、GPS、Wi-Fi、セルラー ネットワークからのシグナルだけでなく、加速度計、ジャイロスコープ、磁力計などのセンサーからのシグナルも組み合わせて使用します。
- Geofencing: この API は Fused Location Provider API を基盤に構築され、電池のパフォーマンスの面で最適化されています。
電池の消耗について
位置情報の収集とバッテリーの消耗は、次のように関連しています。
- 精度: 位置情報データの精度。一般的に、精度が高いほど電池の消耗が激しくなります。
- 頻度: 位置情報が計算される頻度。位置情報の計算頻度が高いほど、電池の消費量が増加します。
- レイテンシ: 位置情報データの配信が遅れる度合。一般的に、レイテンシが低いほど、電池の消費量が増加します。
精度
位置情報の精度を指定するには、setPriority() メソッドを使用し、次の値のいずれかを引数として渡します。
PRIORITY_HIGH_ACCURACYでは、可能な限り最も高い精度の位置情報が提供されます。必要な数の入力を使用して位置情報が計算され(GPS、Wi-Fi、セルラーが有効化され、さまざまなセンサーが使用されます)、電池が著しく消耗する可能性があります。PRIORITY_BALANCED_POWER_ACCURACYでは、正確な位置情報が提供される一方で、電力消費が最適化されます。GPS はほとんど使用されません。通常は、Wi-Fi 情報とセルラー情報の組み合わせがデバイスの位置情報の計算に使用されます。PRIORITY_LOW_POWERでは、主として基地局の情報に依存し、GPS と Wi-Fi からの入力の使用を避けて、電池の消耗を最小限に抑えつつ、低い精度(都市レベル)の位置情報を提供します。PRIORITY_NO_POWERでは、位置情報がすでに計算されている他のアプリからパッシブに位置情報を受け取ります。
ほとんどのアプリでは、バランスのとれた電力オプションまたは低電力オプションを使用して、必要な位置情報を取得できます。高精度のオプションは、フォアグラウンドで実行され、リアルタイムの位置情報の更新を必要とするアプリ(地図アプリなど)でのみ使用してください。
頻度
位置情報の頻度は、以下の 2 つの方法で指定できます。
setIntervalMillis()メソッドを使用して、アプリの位置情報を計算する間隔を指定します。setMinUpdateIntervalMillis()メソッドを使用して、他のアプリの位置情報を受信する間隔を指定します。
setIntervalMillis() を使用する場合は、できるだけ大きい値を渡してください。これは、電池の消耗の原因になりがちなバックグラウンドの位置情報収集では、特に重要です。フォアグラウンドのユースケースに限り、間隔を数秒に設定してください。
このような戦略は Android 8.0(API レベル 26)で導入されたバックグラウンド位置情報の制限に伴って必須になりましたが、Android 7.0(API レベル 24)以前を搭載したデバイスでもアプリに適用するように努める必要があります。
レイテンシ
レイテンシを指定するには、setMaxUpdateDelayMillis() メソッドを使用します。通常は、setIntervalMillis() メソッドで指定した間隔より数倍大きい値を渡します。この設定により、位置情報の配信が遅延されます。また、複数の位置情報の更新データがバッチで配信される場合があります。この 2 つの変更により、電池の消費を最小限に抑えることができます。
アプリが位置情報の更新データをすぐに必要としない場合は、setMaxUpdateDelayMillis() メソッドにできるだけ大きい値を渡します。これにより、レイテンシの増加と引き換えにデータ処理量が増え、電池の消費が効率化されます。
アプリがジオフェンスを使用する場合は、電力を節約するため、setNotificationResponsiveness() メソッドに大きい値を渡す必要があります。5 分以上の値を設定することをおすすめします。
参考資料
詳細については、次のドキュメントをご覧ください。
- 推奨事項: このガイドでは、アプリがバッテリー駆動時間に及ぼす影響を改善するために使用できる具体的な推奨事項について説明します。
- ユースケース: このガイドでは、位置情報サービスを使用できる一般的なユースケースと、それらのユースケースでバッテリー駆動時間への影響を最適化する方法について説明します。