El servicio de larga duración consume mucha batería.
Desarrollé una aplicación y algunas personas se quejan de que requiere demasiada batería, es el segundo proceso que más consume después de la pantalla. Sin embargo, en algunos dispositivos no consume tanta batería.
Todo el trabajo que hace mi aplicación está en un servicio. El servicio está pegajoso y se está ejecutando todo el tiempo (el sistema Android puede matarlo cuando tiene pocos recursos o hacer una pausa cuando el dispositivo se pone en suspensión), escucha al acelerómetro mientras la pantalla esté encendida, no está en primer plano. y no sostiene wakelock.
¿Alguien puede decirme por qué se necesita mucha batería? ¿Y por qué sucede esto solo en algunos de los dispositivos?
Aquí está el código relevante:
public class aListenerService extends Service implements SensorEventListener
{
private BroadcastReceiver mScreenReceiver = new BroadcastReceiver()
{
// if screen was turned on then register to accelerometer
// if screen was turned off then unregister from accelerometer
}
private BroadcastReceiver mPhoneStateReceiver = new BroadcastReceiver()
{
// do something...
}
@Override
public void onCreate()
{
super.onCreate();
// get sensor manager and accelerometer sensor
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// register accelerometer sensor and receiver
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
IntentFilter screenFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
screenFilter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(mScreenReceiver, screenFilter);
registerReceiver(mPhoneStateReceiver, new IntentFilter(INTENT_ACTION_PHONE_STATE));
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
super.onStartCommand(intent, flags, startId);
return Service.START_STICKY;
}
@Override
public void onDestroy()
{
super.onDestroy();
// unregister to sensor and receivers
mSensorManager.unregisterListener(this);
unregisterReceiver(mScreenReceiver);
unregisterReceiver(mPhoneStateReceiver);
}
@Override
public void onSensorChanged(SensorEvent event)
{
// do something...
}
}