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...
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta