13

从 Kitkat (4.4) 开始,Android 报告说我的应用是“高耗电量”。

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

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

编辑:

我了解更改这些参数将节省电池寿命。我的问题更多的是,Android 是否会认识到这些节省电池寿命的尝试,还是仅仅因为它使用 GPS 而将我的应用程序标记为高功耗。

4

3 回答 3

14

好问题,但重复。是的,轮询频率确实对您的电池寿命有很大影响。因此获取用户位置更新的频率应根据具体需求进行调整。

  1. 基本上是您阅读LocationManagerrequestLocationUpdates的android文档,它说:

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

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

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

  2. 请阅读以下内容,了解有关如何消耗电量以及可以采取哪些措施来最大程度地减少电池消耗的一些好的答案:

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

    使用 LocationClient 定期获取更新最省电的方法是什么?

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

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

    位置提供者真的很耗电吗?

    使用 GPS 和后台应用程序 ios/android 时的电池寿命

    保持 GPS 服务有效并优化电池寿命

希望这可以帮助。

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

于 2013-11-15T23:48:03.250 回答
5

我使用了Fused Location(和 [链接已删除]),在每分钟获取一次位置一整天后,我的应用程序使用了大约 4% 的电池。

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

于 2014-04-25T18:44:27.593 回答
0

最近重构获取了代码的位置,学习了一些好的思路,终于实现了一个比较完善的库和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<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;
    }
}

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

标记:

  • 每次请求完成定位,最好去掉Updates,否则手机状态栏会一直显示定位图标
于 2018-03-04T08:37:12.800 回答