Почему бы не использовать всегда android: configChanges = "keyboardHidden | orientation"?

Мне было интересно, почему бы не использовать android:configChanges="keyboardHidden|orientation" в каждой (почти каждой;)) деятельности?

Товары:

  • Не нужно беспокоиться о том, что ваша деятельность была повернута.
  • быстрее

Не так приятно:

  • необходимо изменить макеты, если они зависят от размера экрана (например, макеты с двумя столбцами или около того).

Плохо:

  • нет гибкого способа иметь разные макеты с различной ориентацией.
  • не очень хорошо при использовании фрагментов

Но если мы не используем разные макеты, почему бы и нет?

Ответ 1

Быстрый фон

По умолчанию, когда некоторые изменения конфигурации клавиатуры происходят на Android (общий пример - изменение ориентации), Android полностью перезапускает текущую активность, чтобы помочь ей настроить такие изменения.

Когда вы определяете android:configChanges="keyboardHidden|orientation" в своем AndroidManifest, вы сообщаете Android: "Пожалуйста, не делайте по умолчанию reset, когда клавиатура вытащена, или телефон повернут, и я хочу справиться с этим сам., Я знаю, что делаю"

Это хорошо? Мы скоро увидим...

Не беспокойтесь?

Один из профи, с которого вы начинаете, - это:

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

Во многих случаях люди ошибочно полагают, что когда у них возникает ошибка, возникающая при изменении ориентации ( "вращение" ), они могут просто исправить ее, вставив android:configChanges="keyboardHidden|orientation".

Однако, android: configChanges = "keyboardHidden | orientation" - это не более чем бандад. По правде говоря, существует много способов изменения конфигурации. Например, если пользователь выбирает новый язык (т.е. Язык изменен), ваша активность будет перезапущена так же, как и при изменении ориентации. Если вы хотите, вы можете просмотреть список всех различных изменений конфигурации.

Изменить. Что еще более важно, но как hackbod указывает на комментарии, ваша активность также будет перезапущена, когда ваше приложение находится в фоновом режиме, и Android решает освободить память, убив ее. Когда пользователь вернется в ваше приложение, Android попытается перезапустить действие так же, как если бы оно произошло, если было другое изменение конфигурации. Если вы не можете справиться с этим - пользователь не будет счастлив...

Другими словами, использование android:configChanges="keyboardHidden|orientation" не является решением для ваших "забот". Правильный способ - кодировать свои действия, чтобы они были довольны любым перезапуском Android. Это хорошая практика, которая поможет вам в будущем, поэтому привыкнете к ней.

Итак, когда я должен его использовать?

Как вы упомянули, есть явное преимущество. Перезаписать изменение конфигурации по умолчанию для вращения, обработав его самостоятельно, ускорит процесс. Однако эта скорость действительно с ценой удобства.

Проще говоря, если вы используете один и тот же макет как для портрета, так и для пейзажа, вы в хорошей форме, выполнив перезапись. Вместо полномасштабной перезагрузки активности точки просто смещаются, чтобы заполнить оставшееся пространство.

Однако, если по какой-то причине вы используете другой макет, когда устройство находится в ландшафте, факт, что Android перезагружает вашу активность, хорош, потому что он загрузит правильный макет. [Если вы используете переопределение для такого действия и хотите выполнить магический повторный макет во время выполнения... ну, удачи - это далеко не просто)

Краткая сводка

В любом случае, если android:configChanges="keyboardHidden|orientation" подходит для вас, используйте его. Но ПОЖАЛУЙСТА не забудьте проверить, что произойдет, когда что-то изменится, потому что изменение ориентации не является единственным способом запуска полного перезапуска Acity.

Ответ 2

С моей точки зрения: если макет одинаковый как в ландшафтном, так и в портретном режимах - вы также можете отключить один из двух в своем приложении.

Причина, по которой я заявляю, что я как пользователь ожидаю, что приложение предоставит мне некоторую выгоду, когда я изменю ориентацию. Если это не имеет значения, как я держу свой телефон, тогда мне не нужен выбор.

Возьмем, например, приложение, в котором у вас есть ListView, и после нажатия на ListItem вы хотите просмотреть подробное представление для этого элемента. В ландшафте вы могли бы это сделать, разделив экран на два, имея ListView слева и подробный вид справа. В "Портрет" у вас будет список на одном экране, а затем измените экран на подробный вид, когда выбран ListItem. В этом случае изменение ориентации имеет смысл, а также различные макеты.

Ответ 3

Я не понимаю, почему.... случайные перезагрузки в порядке на мой взгляд... configChanges обрабатывает большинство случаев для меня... ну, может быть, в некоторых типах приложений это может быть проблема, но это зависит от типа приложения и как вы восстанавливаете состояние, когда приложение перезапускается... Когда одно из моих перезагружаемых приложений перезаписывается пользователем, и последнее действие открывается моим кодом, а пользователь jus теряет некоторые шаги, чтобы вернуться туда, где он был, но не имеет большого значения. В другом состоянии всегда сохраняется, и некоторое состояние всегда восстанавливается при перезапуске. Когда активность перезапустилась, это должно было быть, что приложение не использовалось или что-то в этом роде... так что проблем нет... В игре, например, это может быть проблема, может быть, или в каком-то другом приложении, я не знаю...

Я говорю, что когда вы это делаете, приложения просто отлично работают при нормальных обстоятельствах. И код гораздо читабельнее без тонкости логики, необходимой для сохранения и восстановления, где вы можете создавать новые ошибки и постоянно поддерживать их... уверен, что если андроид выйдет из-под власти и убьет ваше окно приложения, он потеряет контекст и снова начинается, но это происходит только в особых ситуациях и на более новых устройствах. Я верю, что это становится все реже...

Так убей меня, но я использую это через приложения довольно успешно... Android: configChanges = "локаль | клавиатура | keyboardHidden | ориентирование | screenLayout | uiMode | Размер экрана | smallestScreenSize" Но я понимаю, что для некоторых специальных приложений это может быть не очень хорошо, но большинство приложений могут жить с этим просто ОК.

Ответ 4

Да, я думаю, что пауза сделает это быстрее, чем освобождение игрока. Все еще есть пауза.

Теперь нашли решение, которое не приостанавливает песню.

Укажите в манифесте, что вы будете обрабатывать изменение конфигурации для ориентации экрана, а затем использовать метод 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);
    }