2013-11-15 2 views
11

Начиная с Kitkat (4.4) Android сообщает, что мое приложение «Высокое потребление батареи».Как Android определяет, имеет ли приложение «использование высокой батареи» в разделе «Недавние запросы местоположения»?

Я использую сетевое расположение, а также GPS. Если отключить GPS, то, похоже, приложение получает отметку «Низкое потребление батареи».

Мне интересно, есть ли какие-либо советы по использованию GPS при сохранении ярлыка «Низкое потребление батареи». Возможно, если вы опросите достаточно редко - или это жестко закодировано для GPS = аккумуляторный убийца?

EDIT:

Я понимаю, что изменение этих параметров будет продлить срок службы батареи. Мой вопрос был больше о том, поймут ли Android эти попытки сохранения батареи или просто заклеймят мое приложение как мощное использование просто потому, что он использует GPS.

+2

Я использовал Fused Location https://developer.android.com/google/play-services/location.html (и вот пример http://www.kpbird.co m/2013/06/fused-location-provider-example.html? m = 1), и после целого дня получения места раз в минуту моя заявка использовала около 4% батареи. –

+0

Спасибо ioan - это именно то, что я искал. Не стесняйтесь публиковать это как ответ ... –

ответ

4

Я использовал Fused Locationhere is an example), и после целого дня получения местоположения раз в минуту моя заявка использовала около 4% батареи.

+0

ссылка мертва. У меня схожая задача. пожалуйста, укажите пример. Благодарю. –

+0

Не будет ли «Google Services» включен в качестве источника дренажа аккумулятора для вашего приложения, поскольку «Fused Location» использует «Службы Google Play»? – jayeshsolanki93

+0

Ссылка на пример была обнаружена с вирусами !!! – Bingerz

14

Хороший вопрос, но повторяющийся. Да, частота опроса сильно влияет на время автономной работы. Таким образом, частота получения обновлений местоположения пользователя должна быть адаптирована в соответствии с конкретными потребностями.

  1. В основном это вы читаете андроида документацию requestLocationUpdates из LocationManager, он говорит:

    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 должен стать основным инструментом для экономии времени автономной работы.

  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

Надеется, что это помогает.

Редактировать: Я согласен с @ioan. Теперь вы можете использовать Fuse Location API, чтобы получить местоположение легко и эффективно.

+0

Я понимаю, что изменение этих параметров позволит сэкономить время автономной работы. Мой вопрос был больше о том, поймут ли Android эти попытки сохранения батареи или просто заклеймят мое приложение как мощное использование просто потому, что он использует GPS. –

+0

Я думаю, что стоит попробовать. Хотя, он должен быть достаточно интеллектуальным, чтобы увидеть фактический разряд батареи, вызванный вашим приложением. Просто потому, что ваше приложение использует GPS, скажем, 3 раза в день, оно не должно расценивать его как «высокое использование батареи». –

+0

Хорошие советы, но это был не вопрос – AlexWien

0

Недавно был реорганизован для получения местоположения кода, изучения хороших идей и, наконец, достижения относительно совершенной библиотеки и демонстрации.

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

Марка:

  • Каждый запрос, чтобы завершить место, то лучше removeUpdates, в противном случае в строке состояния телефона всегда будет отображаться значок позиционирования