Android如何确定应用是否在“最近的位置请求”下“使用高电量”?

截至Kitkat(4.4),Android报告我的应用程序是“高电量使用”。

我使用网络位置以及GPS。 如果我禁用GPS,那么应用程序似乎被标记为“电池使用率低”。

我想知道是否有任何使用GPS的提示,同时保持“低电池使用”标签。 也许如果您不经常轮询 – 或者它是否被硬编码为GPS =电池杀手?

编辑:

我知道更改这些参数可以延长电池寿命。 我的问题更多的是Android是否会认识到这些电池寿命保护的尝试,或者仅仅因为它使用GPS而将我的应用程序称为高功率使用。

我使用了Fused Location (和[ link removed ])并且在每分钟获取一次位置一整天之后,我的应用程序使用了大约4%的电池。

(以前的链接现在是一个试图安装浏览器扩展的停车场: http : //kpbird.com/2013/06/fused-location-provider-example.html?m = 1 )

好问题但重复。 是的,轮询频率会对电池寿命产生很大影响。 因此,应根据具体需求定制获取用户位置更新的频率。

  1. 基本上你是在阅读LocationManager的requestLocationUpdates的android文档,它说:

    requestLocationUpdates (long minTime, float minDistance, Criteria criteria, PendingIntent intent)

    为minTime选择合理的值对于延长电池寿命非常重要。 每个位置更新都需要来自GPS,WIFI,Cell和其他无线电的电源。 选择尽可能高的minTime值,同时仍提供合理的用户体验。 如果您的应用程序不在前台并向用户显示位置,那么您的应用程序应避免使用活动提供程序(例如NETWORK_PROVIDER或GPS_PROVIDER),但如果您坚持,则选择minTime为5 * 60 * 1000(5分钟)或更大。 如果您的应用程序位于前台并向用户显示位置,则选择更快的更新间隔是合适的。

    minDistance参数还可用于控制位置更新的频率。 如果它大于0,那么位置提供程序将仅在位置至少改变minDistance米时向您的应用程序发送更新,并且至少已经过了minTime毫秒。 但是,位置提供商使用minDistance参数更难以节省功耗,因此minTime应该是节省电池寿命的主要工具

  2. 请阅读以下内容,了解一些有关如何排水以及可以采取哪些措施以减少电池消耗的良好答案:

    服务中的Android常规GPS轮询,最大限度地延长电池寿命

    使用LocationClient定期获取更新的电池效率最高的方法是什么?

    在Android中获取用户位置的好方法

    在android中节省gps服务消耗的电池电量

    位置提供商真的是电池耗尽吗?

    如果使用GPS和后台应用程序ios / android,电池寿命

    保持GPS服务活跃并优化电池寿命

希望这可以帮助。

编辑:我同意@ioan。 现在,您可以使用Fused Location API轻松高效地获取位置。

最近重构了获取代码的位置,学习了一些好的想法,最后实现了一个比较完善的库和Demo。

 //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 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; } } 

完整实施: https : //github.com/bingerz/FastLocation/blob/master/fastlocationlib/src/main/java/cn/bingerz/fastlocation/FastLocation.java

标记:

  • 每个请求完成位置,最好删除更新,否则手机状态栏将始终显示定位图标