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

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

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

3 ответов


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

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

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

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

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


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

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

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

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

использование 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());
}

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