Мне было интересно, почему бы не использовать android:configChanges="keyboardHidden|orientation"
в каждом (почти каждый;)) деятельность?
Товар:
- не нужно беспокоиться о вашей активности
- это быстрее
Не очень приятно
- необходимо изменить макеты, если они зависят от размера экрана (например, макеты с двумя столбцами или около того)
Плохой:
- нет гибкого способа иметь разные макеты с разной ориентацией
- не очень хорошо при использовании фрагментов
Но если мы не используем разные макеты, почему бы и нет?
android
android-layout
Mikooos
источник
источник
Ответы:
Быстрый Фон
По умолчанию, когда в Android происходят определенные ключевые изменения конфигурации (типичным примером является изменение ориентации), Android полностью перезапускает запущенную активность, чтобы помочь ей приспособиться к таким изменениям.
Когда вы определяете
android:configChanges="keyboardHidden|orientation"
в своем AndroidManifest, вы говорите Android: «Пожалуйста, не делайте сброс по умолчанию, когда клавиатура извлечена или телефон повернут; я хочу справиться с этим самостоятельно. Да, я знаю, что делаю "Это хорошо? Скоро увидим ...
Не беспокойся?
Одним из плюсов, с которого вы начинаете, является то, что есть:
Во многих случаях люди ошибочно полагают, что, когда у них есть ошибка, которая генерируется изменением ориентации («поворот»), они могут просто исправить ее, вставив
android:configChanges="keyboardHidden|orientation"
.Тем не менее, android: configChanges = "клавиатура скрытая | ориентация" является ничем иным, как бинтом. По правде говоря, существует много способов изменения конфигурации. Например, если пользователь выбирает новый язык (т. Е. Языковой стандарт изменился), ваша деятельность будет возобновлена так же, как при изменении ориентации. Если вы хотите, вы можете просмотреть список всех различных типов изменений конфигурации .
Изменить : что еще более важно, хотя, как указывает hackbod в комментариях, ваша активность также будет перезапущена, когда ваше приложение будет работать в фоновом режиме, и Android решит освободить часть памяти, убив ее. Когда пользователь возвращается к вашему приложению, Android попытается перезапустить действие так же, как и в случае какого-либо другого изменения конфигурации. Если вы не можете справиться с этим - пользователь не будет счастлив ...
Другими словами, использование
android:configChanges="keyboardHidden|orientation"
не является решением для ваших "забот". Правильный путь - это кодировать ваши действия так, чтобы они были довольны любым перезапуском Android. Это хорошая практика, которая поможет вам в будущем, поэтому привыкните к ней.Так, когда я должен использовать это?
Как вы упомянули, есть явное преимущество. Перезапись изменения конфигурации по умолчанию для поворота путем его самостоятельной обработки ускорит процесс. Тем не менее, эта скорость идет с ценой удобства.
Проще говоря, если вы используете один и тот же макет как для портрета, так и для ландшафта, вы в хорошей форме, выполнив перезапись. Вместо полномасштабной перезагрузки действия, представления будут просто перемещаться, чтобы заполнить оставшееся пространство.
Однако , если по какой-то причине вы используете другую компоновку, когда устройство находится в альбомной ориентации, тот факт, что Android перезагружает вашу активность, хорош, потому что тогда она загрузит правильную компоновку. [Если вы используете переопределение в таком Деятельности и хотите сделать магическое изменение макета во время выполнения ... ну, удачи - это далеко не просто]
Краткое резюме
Во что бы то ни стало, если вам
android:configChanges="keyboardHidden|orientation"
подходит, то используйте его. Но ПОЖАЛУЙСТА , обязательно проверьте, что происходит, когда что-то меняется, потому что изменение ориентации - не единственный способ полного перезапуска Действия.источник
Please don't do the default reset when the keyboard is pulled out
я никогда не видел перезапуска Activity для раскладки клавиатуры !С моей точки зрения: если макет одинаков как в альбомном, так и в портретном режимах - вы также можете отключить один из двух в вашем приложении.
Причина, по которой я это заявляю, заключается в том, что я, как пользователь, ожидаю, что приложение предоставит мне некоторую выгоду, когда я поменяю ориентацию. Если неважно, как я держу телефон, выбор мне не нужен.
Возьмем, к примеру, приложение, в котором у вас есть ListView, и после нажатия на ListItem вы хотите, чтобы вам было показано подробное представление для этого элемента. В альбомной ориентации это можно сделать, разделив экран на две части, имея ListView слева и подробный вид справа. В режиме «Портрет» список будет отображаться на одном экране, а затем будет изменен экран на подробный вид при выборе элемента ListItem. В этом случае изменение ориентации имеет смысл, а также различные макеты.
источник
Я не понимаю, почему .... случайные перезапуски в порядке, на мой взгляд ... configChanges обрабатывает большинство случаев для меня ... ну, может быть, в некоторых типах приложений это может быть проблемой, но это действительно зависит от типа приложения и восстановления состояние, когда приложение перезапускается ... Когда одно из моих приложений перезагружается, пользователь снова входит в систему, и мой код открывает последнее действие, и пользователь jus теряет некоторые шаги, чтобы вернуться туда, где он был, но это не имеет большого значения. В других состояние всегда сохраняется и некоторое состояние всегда восстанавливается при перезапуске. Когда активность возобновилась, должно было случиться так, что приложение не использовалось или что-то ... так что никаких проблем вообще ... В игре, например, это может быть проблема, может быть, или в каком-то другом приложении, которое я не знаю ...
Я говорю, что когда вы делаете это таким образом, приложения просто нормально работают в нормальных условиях. И код гораздо более читабелен без тонны логики, необходимой для сохранения и восстановления, где вы просто можете делать новые ошибки и постоянно поддерживать его ... уверен, что если Android выйдет из строя и убьет окно приложения, он потеряет контекст и начинается снова, но это происходит только в особых ситуациях, и на более новых устройствах я верю, что это все реже и реже ...
Так что убейте меня, но я использую это во всех приложениях довольно успешно ... android: configChanges = "locale | клавиатура | клавиатура скрытая | ориентация | screenLayout | uiMode | screenSize | smalllestScreenSize" Но я понимаю, что для некоторых специальных приложений это может быть не хороший способ, но большинство приложений могут жить с этим просто ОК.
источник
Да, я думаю, что пауза сделает это быстрее, чем освобождение игрока. Все еще есть пауза, хотя.
Теперь нашли решение, которое не остановит песню.
Укажите в манифесте, что вы будете обрабатывать изменение конфигурации для ориентации экрана, а затем используйте метод onConfigurationChanged для загрузки файла макета. Делая это в logCat, я вижу, что onPause, onCreate & onResume не вызываются, и поэтому песня не останавливается.
обновить манифест для обработки ориентации.
добавить этот код
источник