2014-10-29 5 views
0

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

Мое местоположение деятельность заключается в следующем:

public abstract class LocationActivity extends FragmentActivity implements LocationListener, GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener { 
    /** 
    * Variables. 
    */ 
    private  AppGlobal   global; 
    private  String    TAG  = "LOCATIONACTIVITY"; 
    private  LocationRequest  mLocationRequest; 
    private  LocationClient  mLocationClient; 
    private  LocationListener listener; 



    /** 
    * 
    */ 
    @Override 
    public void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     setContentView(getLayoutResourceId()); 

     global = ((AppGlobal)getApplicationContext()); 

     mLocationRequest = LocationRequest.create(); 
     mLocationRequest.setInterval(1000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     mLocationRequest.setFastestInterval(1000); 
     mLocationRequest.setSmallestDisplacement(1); 

     mLocationClient = new LocationClient(this, this, this); 
     if(GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS) 
      mLocationClient.connect(); 
    } 



    /** 
    * 
    */ 
    protected abstract int getLayoutResourceId(); 



    /** 
    * 
    */ 
    @Override 
    public void onStop() { 
     Log.v(TAG, "onStop"); 
     if (mLocationClient.isConnected()) { 
      stopPeriodicUpdates(); 
     } 
     mLocationClient.disconnect(); 
     super.onStop(); 
    } 



    /** 
    * 
    */ 
    @Override 
    public void onPause() { 
     super.onPause(); 
     Log.v(TAG, "onPause"); 
     if (mLocationClient.isConnected()) { 
      //mLocationClient.removeLocationUpdates(listener); 
      stopPeriodicUpdates(); 
     } 
    } 



    /** 
    * 
    */ 
    @Override 
    public void onResume() { 
     Log.v(TAG, "onResume"); 
     super.onResume(); 

     if(mLocationClient.isConnected()) { 
      if(listener == null) 
       listener = new LocationListener() { 
       @Override 
       public void onLocationChanged(Location location) { 
        global.latitude = location.getLatitude(); 
        global.longitude = location.getLongitude(); 
       } 
      }; 
      mLocationClient.requestLocationUpdates(mLocationRequest, listener); 
     } else 
      mLocationClient.connect(); 
    } 



    /** 
    * 
    */ 
    private boolean servicesConnected() { 
     Log.v(TAG, "servicesConnected"); 
     int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 
     if (ConnectionResult.SUCCESS == resultCode) { 
      Log.d(LocationUtils.APPTAG, getString(R.string.play_services_available)); 
      return true; 
     } else { 
      return false; 
     } 
    } 



    /** 
    * 
    */ 
    public void getLocation(View v) { 
     Log.v(TAG, "getLocation"); 
     if (servicesConnected()) { 
      Location currentLocation = mLocationClient.getLastLocation(); 
      global.latitude = currentLocation.getLatitude(); 
      global.longitude = currentLocation.getLongitude(); 
     } 
    } 



    /** 
    * 
    */ 
    @Override 
    public void onConnected(Bundle bundle) { 
     Log.v(TAG, "onConnected"); 
     startPeriodicUpdates(); 
    } 



    /** 
    * 
    */ 
    @Override 
    public void onDisconnected() { 
     Log.v(TAG, "onDisconnected"); 
    } 



    /** 
    * 
    */ 
    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     Log.v(TAG, "onConnectionFailed"); 
     if (connectionResult.hasResolution()) { 
      try { 
       connectionResult.startResolutionForResult(this, LocationUtils.CONNECTION_FAILURE_RESOLUTION_REQUEST); 
      } catch (IntentSender.SendIntentException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      //void 
     } 
    } 



    /** 
    * 
    */ 
    @Override 
    public void onLocationChanged(Location location) { 
     Log.v(TAG, "onLocationChanged"); 
     global.latitude = location.getLatitude(); 
     global.longitude = location.getLongitude(); 
     Log.v(TAG, "lat:" + global.latitude); 
     Log.v(TAG, "lon:" + global.longitude); 
    } 



    /** 
    * 
    */ 
    public void startPeriodicUpdates() { 
     Log.v(TAG, "startPeriodicUpdates"); 
     mLocationClient.requestLocationUpdates(mLocationRequest, this); 
    } 



    /** 
    * 
    */ 
    private void stopPeriodicUpdates() { 
     Log.v(TAG, "stopPeriodicUpdates"); 
     mLocationClient.removeLocationUpdates(this); 
    } 


} 

Я думаю, что это должно работать нормально, но я не уверен. Большое спасибо за Вашу помощь.

+0

Ваше приложение перестает получать обновления местоположения, когда приложение находится в фоновом режиме? – TomerZ

+0

Да, logcat показывает, что метод onStop был вызван успешно, и значок местоположения на панели действий исчезает. – Yeray

ответ

1

Вы можете попробовать настроить точность вашего местоположенияRequest на PRIORITY_BALANCED_POWER_ACCURACY и установить более длинный setInterval() и более быстрый setFasterInterval() примерно на 60000 миллисекунд (одна минута). Прямо сейчас вы просите вашего провайдера обновлять местоположение каждую секунду. Если информация не такая чувствительная, и вы не требуете такого быстрого обновления, это будет отличный способ снизить энергопотребление.

Кроме того, приложение может идти в фоновом режиме в OnPause() метод, попробуйте отключить ваш клиент

mLocationClient.disconnect(); 

Я надеюсь, что это помогает!

+0

Я добавляю эту строку в метод onPause, и теперь она работает. Огромное спасибо. – Yeray

+0

Так было сотовой антенной/WiFi-соединением, которая потребляла энергию, когда она была на заднем плане? – TomerZ

 Смежные вопросы

  • Нет связанных вопросов^_^