Держите SensorEventListener во время "ожидания"

Я создаю приложение, которое должно слушать акселерометр все время, даже если приложение не на переднем плане. (На данный момент, я хочу уточнить, что это не приложение для Play Store. Это приложение с определенной целью для внутреннего использования, где разрядка аккумулятора не является большой проблемой - Кроме того, если кто-то знает другой способ проверить, пользователь идет, пожалуйста, дайте мне знать)

Чтобы добиться этого, я создал BroadcastReceiver что слушает android.intent.action.BOOT_COMPLETED и запускает службу, которая регистрирует SensorEventListener, Служба приобретает PARTIAL_WAKE_LOCK и я надеялся, что с этим замком SensorEventListener все равно получит onChange() обратный звонок, но этого не происходит. Однако с FULL_WAKE_LOCK это работает - но я не хочу держать экран включенным, и пользователь может также нажать кнопку режима ожидания... В моих сеансах отладки я никогда не видел, чтобы служба была уничтожена, поэтому блокировку пробуждения никогда не следует снимать.

Вот Service Класс, который получает блокировку и регистрирует датчик:

public class WalkingDetectorService extends Service {

    private static PowerManager.WakeLock wakeLock = null;
    private static final String LOCK_TAG = "WALKING_DETECTOR";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        acquireLock(this);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
            // started on boot from a BroadcastReceiver
        startMotionDetector(getApplication());
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        releaseLock();
        super.onDestroy();
    }

    private void startMotionDetector(Application application) {

        int sensitivityIdx = SettingsManager.getInt(application, SettingsManager.SETTING_SENSOR_SENSITIVITY);

        if (sensitivityIdx == -1) {
            sensitivityIdx = MotionSensor.DEFAULT_SENSITITY_IDX;
        }

        float fSens = MotionSensor.getSensivity(sensitivityIdx);

        //SensorEventListener is registered here. It is properly done. Only stops listen when screen goes off (by timeout or user pressing the standby button)
            MotionSensor.startMotionSensor(application, fSens);

    }

    public static synchronized void acquireLock(Context ctx) {
        if (wakeLock == null) {
            PowerManager mgr = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
            wakeLock = mgr.newWakeLock(PowerManager.FULL_WAKE_LOCK, LOCK_TAG);
            wakeLock.setReferenceCounted(true);
        }
        wakeLock.acquire();
    }

    public static synchronized void releaseLock() {
        if (wakeLock != null) {
            if (wakeLock.isHeld())
            {
                wakeLock.release();
            }
        }
    }
}

Я думаю, что предоставил всю информацию, необходимую для получения от вас помощи. Если вы чувствуете, что есть какой-то фрагмент кода, который будет полезен, я буду рад сотрудничать! Спасибо

0 ответов

Другие вопросы по тегам