我的应用程序在背景中耗尽大量电池
问题描述:
我正在开发使用地理定位的应用程序。问题是,当用户没有关闭它并且应用程序处于后台时,它会耗尽大量电量,我不知道问题出在哪里。我的应用程序在背景中耗尽大量电池
我的位置活动是这样的:
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);
}
}
我想这应该能正常运行,但我不知道。非常感谢您的帮助。
答
您可以尝试将您的LocationRequest的准确性调整为PRIORITY_BALANCED_POWER_ACCURACY,并设置较长的setInterval()和更快的setFasterInterval(),类似60000毫秒(一分钟)。现在你要求你的提供者每秒更新一次位置。如果信息不那么敏感,并且不需要如此快速的更新,那么这将是减少功耗的好方法。
此外,应用程序可以去后台中的onPause()方法,尝试断开你的客户
mLocationClient.disconnect();
我希望这有助于!
当应用程序在后台时,您的应用程序是否停止获取位置更新? – TomerZ 2014-10-29 10:15:16
是的,logcat显示已成功调用onStop方法,并且操作栏中的位置图标消失。 – Yeray 2014-10-29 10:31:46