Один из вариантов - использовать android:configChanges="orientation"
, чтобы сообщить Android, что вы хотите самостоятельно обрабатывать изменения конфигурации, вместо того, чтобы заново создавать действие.Однако это не рекомендуется:
Когда изменение конфигурации происходит во время выполнения, действие отключается и перезапускается по умолчанию, но объявление конфигурации с этим атрибутом предотвратит перезапуск действия.Вместо этого действие продолжает выполняться, и вызывается его метод onConfigurationChanged ().Примечание. Следует избегать использования этого атрибута и использовать его только в качестве крайней меры.Пожалуйста, прочитайте Обработка изменений времени выполнения для получения дополнительной информации о том, как правильно обрабатывать перезапуск из-за изменения конфигурации.( Источник )
Существует другой способ сохранить объект во время изменения конфигурации: ViewModel может использоваться для определения класса оболочки для вашегоданные.Кажется, что каждый экземпляр Activity имеет свой собственный набор ViewModels, доступный через
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
, и если вы используете в нем LiveData
, вы можете подписаться на изменения данных, как указано в документации.Вот их пример на случай, если в какой-то момент связь прекратится:
Компоненты архитектуры предоставляют вспомогательный класс ViewModel для контроллера UI, который отвечает за подготовку данных для интерфейса пользователя.Объекты ViewModel автоматически сохраняются во время изменений конфигурации, поэтому данные, которые они хранят, сразу же становятся доступны для следующего действия или экземпляра фрагмента.Например, если вам нужно отобразить список пользователей в вашем приложении, обязательно назначьте ответственным за получение и сохранение списка пользователей для ViewModel вместо действия или фрагмента, как показано в следующем примере кода:
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<User>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// Do an asynchronous operation to fetch users.
} } You can then access the list from an activity as follows:
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
// Create a ViewModel the first time the system calls an activity's onCreate() method.
// Re-created activities receive the same MyViewModel instance created by the first activity.
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
} }
Если действие воссоздается, оно получает тот же экземпляр MyViewModel, который был создан первым действием.Когда действие владельца завершено, платформа вызывает метод onCleared () объектов ViewModel, чтобы очистить ресурсы.