почему использование android:configChanges - плохая практика

Я просмотрел разные сообщения и вопросы по обработке ротации и AsyncTask. В каждом посте упоминается, что использование android:configChanges — плохая практика. Но я не нашел реальной причины, почему это не рекомендуется и почему это плохая практика. В чем недостаток, если мы используем android:configChanges для обработки ориентации.

Примечание: я знаю, что уже дан ответ, как обращаться с ориентацией и AsyncTask. но я хочу знать причину не использования android:configChanges.


person SAIR    schedule 13.06.2016    source источник


Ответы (3)


Ну, вы должны помнить, что Activity может быть перезапущен по нескольким причинам.

Например, одна из этих причин — когда ваше приложение работает в фоновом режиме, и ОС решает убить его (конечно, с вашим Activity), чтобы освободить память.

Когда вы вернетесь в свое приложение, ОС попытается воссоздать ваш Activity в том виде, в котором вы его оставили, но не сможет этого сделать, потому что вы решили не заморачиваться с этим, просто использовали android:configChanges в своем манифесте.

Если вы убедитесь, что ваше приложение может правильно восстановиться после перезапуска, android:configChanges может вообще не понадобиться. Из-за этого необходимость использовать android:configChanges может указывать на некоторый недостаток в вашем приложении, на который стоит обратить внимание.

Использование android:configChanges не является плохой практикой, но довольно легко может быть, если вы не совсем понимаете, что делаете.

person earthw0rmjim    schedule 13.06.2016

Подводя итог всему, что я получил от ответа @user13 и других вопросов о стеке и сообщениях в блоге, я хотел бы поделиться своим открытием, чтобы прояснить некоторые очень важные аспекты.

  1. (user13) Использование android:configChanges не является плохой практикой, но это довольно легко может быть, если вы точно не понимаете, что делаете.

  2. Использование этого метода не позволяет вам легко использовать ресурсы, специфичные для конфигурации. Например, если вы хотите, чтобы ваш макет, чертежи, строки или что-то еще отличались в портретной и альбомной ориентации, вам придется управлять им самостоятельно, если вы используете android:configChanges.

  3. Вам нужно переопределить и использовать метод onConfigurationChanged() для выполнения определенного действия, если вы решите использовать android:configChanges
  4. Как упомянул пользователь13, активность воссоздается не только из-за изменения ориентации, но и по нескольким причинам, по которым активность может быть перезапущена. Поэтому перезапуск активности должен обрабатываться по всем причинам. использование android:configChanges обрабатывает только один случай, и будут необработанные случаи перезапуска активности, которые могут вызвать ошибку.
  5. Существует несколько и более эффективных способов обработки перезапуска активности, а в stactoverflow также доступно множество справочных материалов, поэтому согласно документации android:configChanges следует использовать в крайнем случае.
person SAIR    schedule 13.06.2016

Использование android:configChanges — хорошая практика, если вы знаете, что делаете.

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

android:configChanges="locale|keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

Ваше приложение будет перезапускаться довольно редко на новых устройствах с большим объемом памяти. Если он перезапустится, это не так уж неожиданно для пользователя, так как пользователь обратил внимание на что-то другое и вернулся в приложение. Пользователь не должен находиться в точно таком же состоянии после перезапуска, если это происходит путем ручного уничтожения приложения или перезапуска приложения из-за некоторых других тяжелых задач (игра в игру), которые выполняет пользователь, здесь важен пользовательский опыт.

Если вам нужно обновить список только для разных макетов для изменения ориентации или вам нужно скрыть некоторые элементы представления, вы можете вызвать:

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    _list.reloadData();
    _editorButton.visible(isPortrait());
}

(Я использую свои собственные классы, но вы поняли)

person Renetik    schedule 08.12.2017