Почему бы не использовать всегда 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 не вызываются, и поэтому песня не останавливается.

  1. обновить манифест для обработки ориентации.

    android:configChanges="orientation|screenSize"
    
  2. добавить этот код

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }
    
Другие вопросы по тегам