Инструкции погружного режима появляются каждый раз, когда устройство переходит в этот режим

Мое приложение использует новый «режим погружения», вызывая (in onCreate ):

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

Это отлично работает, но всплывающее окно «how-to» («Прокрутка вниз сверху вниз») появляется при каждом запуске Activity (если телефон блокируется во время показа активности), хотя пользователь Подтвердил всплывающее окно. Насколько я понимаю, всплывающее окно автоматически генерируется системой, поэтому я ничего не могу сделать, чтобы изменить эту ситуацию, правильно?

Этот вопрос воспроизводится следующим образом:

  1. Запуск immersive Activity [всплывающее окно не появляется, только при первом запуске (правильно)]
  2. Нажмите кнопку питания, чтобы отключить экран во время показа активности.
  3. Нажмите кнопку питания еще раз, чтобы включить экран
  4. Закройте операцию, вызвав функцию finish (), например, с помощью кнопки или опции меню
  5. Запустить активность снова – всплывающее окно снова появляется

Всплывающее окно НЕ появляется, если активность запущена, закрыта и перезапущена без нажатия кнопки включения питания. Кроме того, он ТОЛЬКО появляется, если активность была максимальной при нажатии кнопки питания.

Коррекция: действие нужно закрыть, вызвав «finish ()» (например, с помощью кнопки или опции меню). Он работает правильно, если активность закрыта с помощью клавиши «Назад».

Я загрузил пример приложения здесь: https://github.com/niko001/com.greatbytes.immersivebug/tree/master/Test5

EDIT : теперь есть модуль Xposed, чтобы отключить «режим паники», поэтому я думаю, что я не одинок, когда вижу, что это досада;)

Действительно интересный вопрос! Благодаря вашим четким инструкциям воспроизведение этой проблемы не было проблемой.

Хорошо, после того, как вылетели через источник почти 30 минут и сказали, why would they do this? Куча раз, я думаю, что, наконец, понял. Я постараюсь объяснить все, что могу, но это только моя интерпретация и может быть неправильной:

Кто-то из андроидов понял, что Immersive Mode отправит людей в состояние паники: how do i exit? (_sorry, I don't know what else the panic would be about_) how do i exit? (_sorry, I don't know what else the panic would be about_) .

В этом состоянии паники пользователь переключится на КНОПКУ POWER

….> Кнопка питания -> Пользователь выключает экран (в x миллисекундах с EPOCH)

….> Молитва о возвращении навигационной панели

….> Кнопка питания -> Пользователь включает экран (в y миллисекундах с EPOCH)

Теперь значение y - x имеет значение. Мы обсудим это чуть позже, но сначала давайте посмотрим, как определяется panic :

panic случается, когда Praying the navigation bar comes back дольше 5 секунд. Это значение принадлежит:

 mPanicThresholdMs = context.getResources() .getInteger(R.integer.config_immersive_mode_confirmation_panic); <!-- Threshold (in ms) under which a screen off / screen on will be considered a reset of the immersive mode confirmation prompt.--> <integer name="config_immersive_mode_confirmation_panic">5000</integer> 

Ах хорошо. Таким образом, не имеет значения, если пользователь уже подтвердил один раз, подсказка вернется, если вышеупомянутый критерий будет выполнен – ​​даже на 100-м запуске.

И вот где происходит действие:

 public void onPowerKeyDown(boolean isScreenOn, long time, boolean inImmersiveMode) { if (mPanicPackage != null && !isScreenOn && (time - mPanicTime < mPanicThresholdMs)) { // turning the screen back on within the panic threshold unconfirmPackage(mPanicPackage); } if (isScreenOn && inImmersiveMode) { // turning the screen off, remember if we were in immersive mode mPanicTime = time; mPanicPackage = mLastPackage; } else { mPanicTime = 0; mPanicPackage = null; } } 

(Время – mPanicTime <mPanicThresholdMs) ==> (y – x) <5000

unconfirmPackage(mPanicPackage) удаляет mPanicPackage (ваш) из списка пакетов, хранящихся в разделе Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS .

Само собой разумеется, я нахожу это странным … и неправильным. Даже если пользователь находится в панике и берет маршрут кнопки питания, он / она не увидит полезного напоминания до следующего запуска. Итак, в чем смысл?

Или может быть, я ошибаюсь в определении паники.

Так что я ничего не могу сделать, чтобы изменить эту ситуацию, правильно?

Верный. Чтобы исправить это, вам нужно добавить свое имя пакета в значение, хранящееся в Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS . Но для записи в безопасный параметр ваше приложение требует разрешения WRITE_SECURE_SETTINGS – не для использования сторонними приложениями.

Ссылки:

ImmersiveModeConfirmation (вспомогательный класс, который управляет отображением / скрытием подсказки подтверждения)

Более лаконично – в K пользователи получат подтверждение при входе в режим погружения, если:

  • Они еще не подтвердили это приложение (пакет).
  • Они «запаниковали» в последний раз, когда они были в погруженном режиме. «Паника» в этом случае означает отключение экрана, а затем обратно менее чем за 5 секунд (по умолчанию).