我的应用程序在背景中耗尽大量电池

问题描述:

我正在开发使用地理定位的应用程序。问题是,当用户没有关闭它并且应用程序处于后台时,它会耗尽大量电量,我不知道问题出在哪里。我的应用程序在背景中耗尽大量电池

我的位置活动是这样的:

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 2014-10-29 10:15:16

+0

是的,logcat显示已成功调用onStop方法,并且操作栏中的位置图标消失。 – Yeray 2014-10-29 10:31:46

您可以尝试将您的LocationRequest的准确性调整为PRIORITY_BALANCED_POWER_ACCURACY,并设置较长的setInterval()和更快的setFasterInterval(),类似60000毫秒(一分钟)。现在你要求你的提供者每秒更新一次位置。如果信息不那么敏感,并且不需要如此快速的更新,那么这将是减少功耗的好方法。

此外,应用程序可以去后台中的onPause()方法,尝试断开你的客户

mLocationClient.disconnect(); 

我希望这有助于!

+0

我在onPause方法中添加该行,现在它可以工作。非常感谢。 – Yeray 2014-10-29 13:18:50

+0

因此,蜂窝天线/ WiFi连接在背景中消耗功率时是如此? – TomerZ 2014-10-29 16:07:07