Android: эффективное управление поворотом экрана

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

Я знаю несколько способов решить эту проблему, но меня интересует наиболее эффективный способ.

1) Сообщить манифесту, что я обработаю изменение ориентации, переопределив метод onConfigurationChanged() и оставив его пустым.

2) переопределить onSaveInstanceState() и сохранить данные здесь для повторного заполнения в onCreate()

3) Переопределить onPause(), который создаст пакет данных и отправит его onSaveInstanceState().

Очевидно, это все варианты, но какой из них предпочтительнее (маленький, средний, большой объем данных)

Спасибо


person Sababado    schedule 25.01.2012    source источник
comment
Один из способов — остановить повторное создание Activity и просто переключаться между книжной и альбомной ориентацией. Проверьте мой ответ 7749727">здесь   -  person Lalit Poptani    schedule 25.01.2012
comment
Хотя этот способ работает хорошо, я хочу иметь возможность использовать автоматическое изменение макетов с помощью папки res/layout-land. Если, конечно, это не слишком много накладных расходов для простой деятельности.   -  person Sababado    schedule 26.01.2012
comment
Что ж, это автоматически изменит его макет, вам просто нужно изменить представление контента в коде, вот и все.   -  person Lalit Poptani    schedule 27.01.2012


Ответы (1)


Некоторые конфигурации устройства могут изменяться во время выполнения (например, ориентация экрана, доступность клавиатуры и язык). Когда происходит такое изменение, Android перезапускает запущенную Activity (вызывается onDestroy(), а затем onCreate()).

  • Для правильной обработки перезапуска важно, чтобы ваша активность восстанавливала свое предыдущее состояние через обычный жизненный цикл активности, в котором Android вызывает onSaveInstanceState() перед тем, как уничтожить вашу активность, чтобы вы могли сохранить данные о состоянии приложения. Затем вы можете восстановить состояние во время onCreate() или onRestoreInstanceState().

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

  1. Сохранение объекта при изменении конфигурации

    Разрешите перезапуск вашей активности при изменении конфигурации, но перенесите объект с состоянием в новый экземпляр вашей активности.

  2. Выполняйте изменение конфигурации самостоятельно

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

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

EDIT: В соответствии с вашей потребностью просто изменить макет, я думаю, вам нужно использовать onConfigurationChanged() и внести в него изменения.

person user370305    schedule 25.01.2012
comment
Как это относится к фрагментам? - person Andrew Orobator; 04.04.2014