В настоящее время я встраиваю в свое приложение некоторые функции обнаружения движения. Я не нашел способа постоянно контролировать акселерометр, не заставляя телефон постоянно спать. Пытаясь преодолеть это, у меня в настоящее время есть служба, реализующая SensorEventListener. Я могу запускать эту службу через определенные промежутки времени (с помощью диспетчера аварийных сигналов), получать показания акселерометра устройства, определять, движется ли устройство, а затем закрывать службу. Обычно это выглядит следующим образом:
public class MyService extends Service implements SensorEventListener {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
/* Register this SensorEventListener with Android sensor service */
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
/* Unregister SensorEventListener */
}
/* SensorEventListener Implementation ************************/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
/* Receives callback when sensor values change */
@Override
public void onSensorChanged(SensorEvent event) {
/* Determine if moving & then call stopSelf() to shut service down */
}
}
Однако у меня есть еще одна проблема: в моем приложении есть вторая служба, которая вызывается по другому расписанию. Насколько мне известно, обе службы будут запускаться в одном потоке, что нехорошо, поскольку они могут конфликтовать.
Мне нужно знать, есть ли безопасный способ одновременного запуска нескольких служб в одном приложении . Я рассмотрел возможность использования IntentService вместо стандартного класса Service. Я знаю, что они реализуют собственный рабочий поток для обработки вызовов. Проблема в том, что я понятия не имею, как я могу реализовать тип асинхронных обратных вызовов, требуемых SensorEventListener, из IntentService. Другими словами, у меня нет гарантии, что такой метод, как onSensorChanged, получит обратный вызов до того, как IntentService завершит свою работу и отключится.
Приветствуем любые предложения по обходному пути этой проблемы.