Вибрация прекращается, и я не знаю, почему

#android #android-lifecycle #wakelock #android-vibration

#Android #android-жизненный цикл #блокировка пробуждения #android-вибрация

Вопрос:

У меня есть служба, которая запускает действие, когда происходит определенное событие. Затем это действие запускает вибратор. Все это отлично работает, когда я занимаюсь своей основной деятельностью, однако, когда устройство заблокировано, оно вибрирует только один раз, а затем останавливается. Вот пример моего кода code Service code

 public class VService extends Service { 

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    getV();
    return START_STICKY;
}

public class getV() {
    if (value > 10) {
        Intent alarmIntent = new Intent(getBaseContext(), Alarm.class);
        alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                                     
        alarmIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT):    
        alarmIntent.putExtra("v", value);
        getApplication().startActivity(alarmIntent);
}
}
  

Логика моего класса Alarm выглядит следующим образом…
onCreate запускает вибрацию с помощью

 vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); long[]
pattern = {0, 100, 1000}; vib.vibrate(pattern, 0);
  

onDestory останавливает вибрацию с помощью vib.cancel();
Единственное другое место, где вызывается vib.cancel(), — это проверка обработчика, если v меньше 10, но это не может быть причиной, потому что я не сделал v меньше 10. vib.cancel(); также вызывается нажатием кнопки.

Области, на которые я смотрел — это происходит только тогда, когда экран выключен, так что, может быть, это как-то связано с моим onCreate, где я делаю релиз wakelock?

 Runnable releaseWakelock = new Runnable() {

        @Override
        public void run() {
            getWindow().clearFlags(
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
            getWindow().clearFlags(
                    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
            getWindow().clearFlags(
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
            getWindow().clearFlags(
                    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

            if (mWakeLock != null amp;amp; mWakeLock.isHeld()) {
                mWakeLock.release();
            }
        }
    };
  

Или my on resume, который в основном вызывает то же самое, но использует службу питания для включения экрана.

Итак, мой вопрос в том, почему мой вибратор вибрирует только один раз, когда запускается AlarmClass, когда экран выключен, но отлично работает, когда экран включен? Я пытался разобраться в этом, спасибо за любой вклад или помощь.

РЕДАКТИРОВАТЬ: запускаемый объект выполняется в onCreate класса Alarm. В классе onResume выполняется следующее.

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

    // Acquire wakelock
    PowerManager pm = (PowerManager) getApplicationContext()
            .getSystemService(Context.POWER_SERVICE);
    if (mWakeLock == null) {
        mWakeLock = pm
                .newWakeLock(
                        (PowerManager.FULL_WAKE_LOCK
                                | PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP),
                        TAG);
    }

    if (!mWakeLock.isHeld()) {
        mWakeLock.acquire();
        Log.i(TAG, "Wakelock aquired!!");
    }
  

Комментарии:

1. Это моя первая публикация, поэтому любые советы по формату вопросов или этикету приветствуются.

2. Хорошее начало, но можете ли вы показать, как вы получаете блокировку и когда запускается запускаемый релиз?

3. @DaveMorrissey Я отредактировал свой вопрос, чтобы показать ответ на ваш вопрос. Спасибо за быстрый ответ.

4. Вызов этого runnable в вашем onCreate означает, что флаги снимаются почти сразу, поэтому действие не будет поддерживать экран включенным. Возможно, я неправильно это понимаю.

5. Может быть, я плохо это объясняю. Действие запускается правильно, независимо от того, включен экран или выключен. Экран остается освещенным до тех пор, пока пользователь не выполнит действие. Проблема в том, что всякий раз, когда действие запускается при выключенном экране, устройство вибрирует только один раз, когда оно должно вибрировать непрерывно. @DaveMorrissey