Długo działająca usługa zużywa dużo baterii
Opracowałem aplikację, a niektórzy ludzie narzekają, że zajmuje zbyt dużo baterii, jest to drugi najbardziej zużywający się proces po ekranie. Jednak w niektórych urządzeniach nie zużywa tak dużo baterii.
Cała praca, którą wykonuje moja aplikacja, polega na usługach. Usługa jest lepka i działa cały czas (system Android może ją zabić, gdy ma niskie zasoby lub wstrzymać ją, gdy urządzenie przejdzie w stan uśpienia), ma słuchacza akcelerometru, dopóki ekran jest włączony, nie jest to usługa na pierwszym planie i nie trzyma wakelocka.
Czy ktoś może mi powiedzieć, dlaczego zajmuje dużo baterii? A dlaczego tak się dzieje tylko na niektórych urządzeniach?
Oto odpowiedni kod:
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...
}
}