Почему бы не использовать всегда android: configChanges = "клавиатура скрытая | ориентация"? - PullRequest
171 голосов
/ 19 октября 2011

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

Товар:

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

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

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

Bad:

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

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

Ответы [ 4 ]

319 голосов
/ 03 ноября 2011

Быстрый фон

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

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

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

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

Один из плюсов, с которых вы начинаете, заключается в том, что:

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

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

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

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

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

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

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

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

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

Краткое резюме

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

2 голосов
/ 19 октября 2011

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

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

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

0 голосов
/ 07 мая 2015

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

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

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

0 голосов
/ 20 января 2014

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

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

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