Android: бывают ли случаи, когда Activity воссоздается, даже если для android: configChanges = установлено все? - PullRequest
1 голос
/ 31 мая 2011

Во-первых, краткое описание фона проблемы:

У меня возникли проблемы с обработкой жизненных циклов фоновых рабочих в соответствии с жизненным циклом Activity.Первая проблема заключается в том, что каждый раз при изменении конфигурации создается новый экземпляр действия (в том числе ориентация экрана), поэтому мне пришлось перетянуть рабочих из старого экземпляра в новый.Во-вторых, это осложняется тем фактом, что иногда рабочие отображают диалоговое окно прогресса, а иногда - диалоговое окно с ошибкой, с которым пользователь должен взаимодействовать.Работа со всеми этими вещами - рабочими, диалогами и т. Д. - во всех экземплярах действия стала настолько сложной, что теперь я ясно вижу, что это был неправильный путь.

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

Теперь возникает вопрос:

Учитывая, что у активности есть android:configChanges="...", которая включает все возможные вещи (ориентация, клавиатура и всеостальное) - есть ли гарантия, что действие создается только один раз, пока оно живое, а не уничтожено / воссоздано даже в фоновом режиме? Документация по этому вопросу не ясна.

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

Я очень ценю ваши ответы.

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

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Если вы спрашиваете об этом, ваше приложение, вероятно, сломано.

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

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

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

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

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

0 голосов
/ 31 мая 2011

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

Вот пример того, как это сделать: Какобъявить глобальные переменные в Android?

...