#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