почему приложение воссоздано, но в onCreate действия все еще передано saveInstanceState

Наличие ошибки, связанной с уничтожением/восстановлением активности ОС (или приложения?).

После некоторой отладки, если установить don't keep activities и установить Background process limit на no background process, это приведет к другому поведению.

видел этот пост, но это не отвечает на вопрос здесь.

Вот что наблюдал:

В приложении он запускает компонент кинжала и поддерживает некоторый одноэлементный объект области приложения, а в действии A (действие запуска по умолчанию) он будет действием пользователя запускать действие B, в B он создает и размещает фрагмент. В одноэлементном объекте области приложения будут храниться некоторые данные для работы с фрагментом.

В случае установки только don't keep activities при сворачивании приложения вызываются действия onDestroy(), а при повторном открытии приложения оно восстанавливает последнее активное действие (скажем, пользователь открыл действие B, B будет воссоздан с фрагментом, восстановленным с сохраненнымInstanceState). В этом случае одноэлементные объекты области приложения, управляемые кинжалом, все еще живы, поэтому состояние полностью восстанавливается до того, что было до сворачивания приложения.

Но если есть как don't keep activities, так и установить Background process limit в no background process, то при сворачивании приложения onDestroy() активности не вызывается (только вызов onStop()).

Изменение поведения в настоящее время, если повторно открыть приложение, начнется с приложения onCreate() и воссоздает компонент кинжала. Таким образом, состояние перед свертыванием приложения не восстанавливается.

Но os, похоже, все еще помнит, что последнее действие - B, а B

onCreate(savedInstanceState: Bundle?) 

вызывается с saveInstanceState, сохраняющим данные при сворачивании приложения, так же как и фрагмент B.

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

Кто-нибудь знает в этом случае, где сохраняется saveInstance, и почему, хотя приложение кажется воссозданным, но все же повторно сохраняется последнее действие (не запускающее действие)?


person lannyf    schedule 06.03.2018    source источник


Ответы (1)


Пакет savedInstanceState явно предназначен для того, чтобы делать то, что вы описываете. Независимо от того, уничтожается ли фоновая активность для сохранения памяти (например, включено «не сохранять действия») или весь процесс приложения уничтожается для сохранения памяти (например, «предел фонового процесса» равен нулю), инфраструктура предоставит ваше приложение может сохранять информацию о состоянии в пакете savedInstanceState и впоследствии будет возвращать вам эту информацию о состоянии при будущих вызовах onCreate().

Единственная ситуация, в которой savedInstanceState будет null, — это самый первый запуск вашей активности. Неважно, убит процесс вашего приложения или нет; если ваша активность восстановится, вы получите ненулевой пакет savedInstanceState.

person Ben P.    schedule 06.03.2018
comment
Спасибо Бен! developerphil.com/dont-store-data-in- the-application-object также помогает. - person lannyf; 07.03.2018