Android は、アプリの「最近の位置情報リクエスト」に「バッテリー使用量が多い」かどうかをどのように判断しますか?
-
21-12-2019 - |
質問
Kitkat (4.4) の時点で、Android はアプリが「バッテリー使用量が多い」と報告しています。
私はネットワークロケーションとGPSを使用しています。GPS を無効にすると、アプリが「バッテリー使用量低下」としてマークされるようです。
「バッテリー使用量が少ない」ラベルを維持しながら GPS を使用するためのヒントがあるかどうか疑問に思っています。おそらく、ポーリングの頻度が十分に低い場合、または GPS = バッテリーキラーにハードコードされているのでしょうか?
編集:
これらのパラメータを変更するとバッテリー寿命が節約されることを理解しています。私の質問は、Android がバッテリー寿命を節約するためのこうした試みを認識するのか、それとも単に GPS を使用しているというだけの理由で私のアプリを電力使用量が多いと判断するのかということでした。
解決
私は real="nofollow noreferrer">融合場所(およびリンクを削除しました])そして毎分の毎日の後、私のアプリケーションはバッテリーの約4%を使用しました。
(以前のリンクは、ブラウザの拡張子のインストールを試みる駐車場です。 http://kpbird.com/2013/06/fused-location-provider-example.html?m=1 )
他のヒント
良い質問ですが、繰り返しになります。はい、ポーリング頻度はバッテリー寿命に大きく影響します。したがって、ユーザーの位置情報の更新を取得する頻度は、特定のニーズに応じて調整する必要があります。
基本的には Android のドキュメントを読んでください。
requestLocationUpdates
の ロケーションマネージャー, 、それはこう言います:requestLocationUpdates (long minTime, float minDistance, Criteria criteria, PendingIntent intent)
バッテリー寿命を節約するには、minTime に適切な値を選択することが重要です。 位置情報を更新するたびに、GPS、WIFI、セル、その他の無線からの電力が必要になります。適切なユーザー エクスペリエンスを提供しながら、できるだけ高い minTime 値を選択します。アプリケーションがフォアグラウンドになく、ユーザーに位置を表示していない場合、アプリケーションはアクティブなプロバイダー (NETWORK_PROVIDER や GPS_PROVIDER など) の使用を避ける必要がありますが、どうしても使用したい場合は、minTime として 5 * 60 * 1000 (5 分) を選択するか、もっと大きい。アプリケーションがフォアグラウンドにあり、ユーザーに位置情報を表示している場合は、より速い更新間隔を選択することが適切です。
minDistance パラメーターを使用して、位置更新の頻度を制御することもできます。これが 0 より大きい場合、位置プロバイダーは、位置が少なくとも minDistance メートル変更され、かつ少なくとも minTime ミリ秒が経過したときにのみアプリケーションに更新を送信します。ただし、位置情報プロバイダーが minDistance パラメーターを使用して電力を節約することはより困難であるため、 minTime はバッテリー寿命を節約するための主要なツールである必要があります.
バッテリーの消耗の仕組みと、バッテリーの消耗を最小限に抑えるために何ができるかを知るためのいくつかの良い回答については、以下をお読みください。
Android の通常の GPS ポーリングがサービス中、バッテリー寿命を最大化
LocationClient を使用して定期的に更新を取得する最もバッテリー効率の良い方法は何ですか?
Android の GPS サービスによって消費されるバッテリー電力を節約します
位置情報プロバイダーは本当にバッテリーを消耗するのでしょうか?
お役に立てれば。
編集:@ioan に同意します。Fused Location API を使用して、位置を簡単かつ効率的に取得できるようになりました。
最近リファクタリングされたコードの場所を取得し、いくつかの良いアイデアを学び、そして最後に比較的完璧な図書館とデモを達成しました。
//request all valid provider(network/gps)
private boolean requestAllProviderUpdates() {
checkRuntimeEnvironment();
checkPermission();
if (isRequesting) {
EasyLog.d("Request location update is busy");
return false;
}
long minTime = getCheckTimeInterval();
float minDistance = getCheckMinDistance();
if (mMapLocationListeners == null) {
mMapLocationListeners = new HashMap<>();
}
mValidProviders = getValidProviders();
if (mValidProviders == null || mValidProviders.isEmpty()) {
throw new IllegalArgumentException("Not available provider.");
}
for (String provider : mValidProviders) {
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if (location == null) {
EasyLog.e("LocationListener callback location is null.");
return;
}
printf(location);
mLastProviderTimestamp = location.getTime();
if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
finishResult(location);
} else {
doLocationResult(location);
}
removeProvider(location.getProvider());
if (isEmptyValidProviders()) {
requestTimeoutMsgInit();
removeUpdates();
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
getLocationManager().requestLocationUpdates(provider, minTime, minDistance, locationListener);
mMapLocationListeners.put(provider, locationListener);
EasyLog.d("Location request %s provider update.", provider);
}
isRequesting = true;
return true;
}
//remove request update
public void removeUpdates() {
checkRuntimeEnvironment();
LocationManager locationManager = getLocationManager();
if (mMapLocationListeners != null) {
Set<String> keys = mMapLocationListeners.keySet();
for (String key : keys) {
LocationListener locationListener = mMapLocationListeners.get(key);
if (locationListener != null) {
locationManager.removeUpdates(locationListener);
EasyLog.d("Remove location update, provider is " + key);
}
}
mMapLocationListeners.clear();
isRequesting = false;
}
}
.
完全実装:
マーク:
- 場所を完成させる要求は、それを削除するのが最善です。それ以外の場合は、電話ステータスバーに位置決めアイコン が表示されます。