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

时间:2013-11-15 23:34:22

标签: android gps location battery android-4.4-kitkat

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

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

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

编辑:

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

3 个答案:

答案 0 :(得分:14)

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

  1. 您基本上是在阅读LocationManagerrequestLocationUpdates的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 Regular GPS Polling in Service, maximizing battery life

    What's the most battery-efficient approach of using LocationClient to periodically get updates?

    Good way of getting the user's location in Android

    Save battery power consumed by gps services in android

    Is location provider really a battery drain?

    Battery life if using GPS and background app ios/android

    Keeping a GPS service alive and optimizing battery life

  3. 希望这有帮助。

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

答案 1 :(得分:5)

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

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

答案 2 :(得分: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

标记:

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