Ответ 1
Действительно интересный вопрос! Благодаря вашим четким инструкциям воспроизведение этой проблемы не было проблемой.
Хорошо, после того, как вы пробрались через источник почти на 30 минут и сказал why would they do this?
кучу раз, я думаю, что, наконец, понял. Я попытаюсь объяснить все, что могу, но это только моя интерпретация и может быть неправильной:
Кто-то из android понял, что Immersive Mode отправит людей в состояние паники: 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
- не для использования сторонними приложениями.
Ссылки: