Почему бы не использовать всегда android:configChanges="клавиатура скрытая | ориентация"?
Мне было интересно, почему бы не использовать android:configChanges="keyboardHidden|orientation"
в каждой (почти каждой;) деятельности?
Груз:
- не нужно беспокоиться о вашей активности
- это быстрее
Не очень приятно
- необходимо изменить макеты, если они зависят от размера экрана (например, макеты с двумя столбцами или около того)
Плохой:
- нет гибкого способа иметь разные макеты с разной ориентацией
- не очень хорошо при использовании фрагментов
Но если мы не используем разные макеты, почему бы и нет?
4 ответа
Быстрый Фон
По умолчанию, когда в 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"
подходит именно вам, тогда используйте его. Но ПОЖАЛУЙСТА, обязательно проверяйте, что происходит, когда что-то меняется, потому что изменение ориентации - не единственный способ полного перезапуска Acctivity.
С моей точки зрения: если макет одинаков как в альбомном, так и в портретном режимах - вы также можете отключить один из двух в вашем приложении.
Причина, по которой я это заявляю, заключается в том, что я, как пользователь, ожидаю, что приложение предоставит мне некоторую выгоду, когда я изменю ориентацию. Если неважно, как я держу телефон, выбор мне не нужен.
Возьмем, к примеру, приложение, в котором у вас есть ListView, и после нажатия на ListItem вы хотите, чтобы вам было показано подробное представление для этого элемента. В альбомной ориентации это можно сделать, разделив экран на две части, имея ListView слева и подробный вид справа. В режиме "Портрет" список будет отображаться на одном экране, а затем будет изменен экран на подробный вид при выборе элемента ListItem. В этом случае изменение ориентации имеет смысл, а также различные макеты.
Я не понимаю, почему.... случайные перезапуски в порядке, на мой взгляд... configChanges обрабатывает большинство случаев для меня... ну, может быть, в некоторых типах приложений это может быть проблемой, но это действительно зависит от типа приложения и как вы восстанавливаете состояние, когда приложение перезапускается... Когда одно из моих приложений перезагружается, пользователь снова входит в систему, и мой код открывает последнее действие, и пользователь jus теряет некоторые шаги, чтобы вернуться туда, где он был, но это не имеет большого значения. В других состояние всегда сохраняется и некоторое состояние всегда восстанавливается при перезапуске. Когда активность возобновилась, должно было случиться так, что приложение не использовалось или что-то... так что никаких проблем вообще... В игре, например, это может быть проблемой, может быть, или в каком-то другом приложении, которое я не знаю...
Я говорю, что когда вы делаете это таким образом, приложения просто нормально работают в нормальных условиях. И код гораздо более читабелен без тонны логики, необходимой для сохранения и восстановления, когда вы просто можете делать новые ошибки и постоянно поддерживать его... уверен, что если Android выйдет из строя и убьет окно приложения, он потеряет контекст и начинается снова, но это происходит только в особых ситуациях, и на более новых устройствах я верю, что это все реже и реже...
Так что убейте меня, но я использую это в разных приложениях довольно успешно... android:configChanges="locale| клавиатура | клавиатура скрытая | ориентация |screenLayout|uiMode|screenSize|smalllestScreenSize" Но я понимаю, что для некоторых специальных приложений это может быть не так хороший способ, но большинство приложений могут жить с этим просто ОК.
Да, я думаю, что пауза сделает это быстрее, чем освобождение игрока. Все еще есть пауза, хотя.
Теперь нашли решение, которое не остановит песню.
Укажите в манифесте, что вы будете обрабатывать изменение конфигурации для ориентации экрана, а затем используйте метод onConfigurationChanged для загрузки файла макета. Делая это в logCat, я вижу, что onPause, onCreate & onResume не вызываются, и поэтому песня не останавливается.
обновить манифест для обработки ориентации.
android:configChanges="orientation|screenSize"
добавить этот код
@Override public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-generated method stub super.onConfigurationChanged(newConfig); setContentView(R.layout.activity_main); }