savedinstancestate android что это

Настройки и состояние приложения

Сохранение состояния приложения

Чтобы точнее понять проблему, с которой мы можем столкнуться, рассмотрим пример. Изменим файл activity_main следующим образом:

Здесь определено поле EditText, в которое вводим имя. И также определена кнопка для его сохранения.

Теперь изменим класс MainActivity :

Запустим приложение введем какое-нибудь имя, сохраним и получим его в TextView:

savedinstancestate android что это. Смотреть фото savedinstancestate android что это. Смотреть картинку savedinstancestate android что это. Картинка про savedinstancestate android что это. Фото savedinstancestate android что это

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

savedinstancestate android что это. Смотреть фото savedinstancestate android что это. Смотреть картинку savedinstancestate android что это. Картинка про savedinstancestate android что это. Фото savedinstancestate android что это

И даже если мы попробуем заново получить значение из переменной name, то мы увидим, что она обнулилась:

savedinstancestate android что это. Смотреть фото savedinstancestate android что это. Смотреть картинку savedinstancestate android что это. Картинка про savedinstancestate android что это. Фото savedinstancestate android что это

Чтобы избежать подобных ситуаций как раз и следует сохранять и восстанавливать состояние activity. Для этого изменим код MainActivity:

put() : универсальный метод, который добавляет значение типа Object. Соответственно поле получения данное значение необходимо преобразовать к нужному типу

putString() : добавляет объект типа String

putInt() : добавляет значение типа int

putByte() : добавляет значение типа byte

putChar() : добавляет значение типа char

putShort() : добавляет значение типа short

putLong() : добавляет значение типа long

putFloat() : добавляет значение типа float

putDouble() : добавляет значение типа double

putBoolean() : добавляет значение типа boolean

putCharArray() : добавляет массив объектов char

putIntArray() : добавляет массив объектов int

putFloatArray() : добавляет массив объектов float

putSerializable() : добавляет объект интерфейса Serializable

putParcelable() : добавляет объект Parcelable

get() : универсальный метод, который возвращает значение типа Object. Соответственно поле получения данное значение необходимо преобразовать к нужному типу

getString() : возвращает объект типа String

getInt() : возвращает значение типа int

getByte() : возвращает значение типа byte

getChar() : возвращает значение типа char

getShort() : возвращает значение типа short

getLong() : возвращает значение типа long

getFloat() : возвращает значение типа float

getDouble() : возвращает значение типа double

getBoolean() : возвращает значение типа boolean

getCharArray() : возвращает массив объектов char

getIntArray() : возвращает массив объектов int

getFloatArray() : возвращает массив объектов float

getSerializable() : возвращает объект интерфейса Serializable

getParcelable() : возвращает объект Parcelable

Для примера рассмотрим сохранение-получение более сложных данных. Например, объектов определенного класса. Пусть у нас есть класс User :

Пусть у нас будет следующий интерфейс в activity_main.xml :

Здесь определены два поля ввода для имени и возраста соответственно.

В классе MainActivity пропишем логику сохранения и получения данных:

Здесь также сохраняем данные в переменную User, которая предварительно инициализированна некоторыми данными по умолчанию. А при нажатии на кнопку получения получем данные из переменной и передаем их для вывода в текстовое поле.

Источник

Методы активности

Методы

В статье приведены только часть методов. Остальные изучайте самостоятельно через документацию.

При переходе активности от одного состояния к другому, она получает уведомления через защищенные методы:

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

При реализации любого из этих методов необходимо всегда сначала вызывать версию этого метода из суперкласса. Например:

Семь перечисленных методов определяют весь жизненный цикл активности. Есть три вложенных цикла, которые вы можете отслеживать в классе активности:

Можно написать код с заглушками для методов внутри Активности, которые обрабатывают изменения состояний. Комментарии к каждой такой заглушке описывают действия, которые нужно учитывать при обработке этих событий.

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

Методы жизненного цикла описаны в отдельной статье. Здесь их опишем кратко и рассмотрим другие методы.

Метод addContentView()

Метод addContentView() добавляет компонент к уже существующей разметке. Пример смотрите здесь.

Метод findViewById()

Метод findViewById() позволяет получить ссылку на View, которая размещена в разметке через его идентификатор.

Если вы используете фрагменты, то когда они загружаются в активность, то компоненты, входящие в состав фрагмента, становятся частью иерархии активности. И вы можете использовать метод findViewById() для получения ссылки к компоненту фрагмента.

Не путать с одноимённым методом для класса View.

Метод finish()

C помощью метода finish() можно завершить работу активности. Если приложение состоит из одной активности, то этого делать не следует, так как система сама завершит работу приложения. Если же приложение содержит несколько активностей, между которыми нужно переключаться, то данный метод позволяет экономить ресурсы.

Метод getFragmentManager()

Каждая активность включает в себя Менеджер фрагментов для управления фрагментами, если они используются. Метод getFragmentManager() позволяет получить доступ к данному менеджеру. На сайте есть отдельные статьи, посвящённые фрагментам.

Метод getParentActivityIntent()

Возвращает намерение, которое может запускать активность, являющей родительской. Родительская активность прописывается в манифесте. Вы можете переопределить данное намерение для своих целей. Метод появился в API 16.

Метод onActivityResult()

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

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

Метод принимает несколько параметров:

Метод onBackPressed()

Метод, позволяющий отследить нажатине на кнопку Back. Появился в Android 2.0 (API 5). Пример использования можно посмотреть в статье Кнопка Back: Вы уверены, что хотите выйти из программы?.

Метод onConfigurationChanged()

Метод, который вызывается при изменении конфигурации устройства. Если в манифесте были установлены специальные параметры у атрибута android:configChanges, то данный метод не будет вызван.

Метод onKeyShortcut()

Метод onPostCreate()

Новый метод, который появился в API 21. Он вызывается позже onCreate() и в нём можно получить значения размеров компонентов, которые недоступны при построении интерфейса в методе onCreate().

Метод overridePendingTransition()

Метод overridePendingTransition() позволяет задать анимацию при переходе от одной активности к другой. Пример смотрите здесь.

Метод onRestoreInstanceState()

У метода onRestoreInstanceState() есть такой же параметр Bundle, как у onCreate(), и вы можете восстанавливать сохранённые значения из метода onSaveInstanceState(). Во многих случаях это пример личных предпочтений, какой из двух методов использовать для восстановления данных.

Метод вызывается после метода onStart(). Система вызывает метод onRestoreInstanceState() только в том случае, если имеются сохранённые данные для восстановления. Таким образом вам не нужно проверять Bundle на null, как в методе onCreate():

Метод onSaveInstanceState()

Когда система завершает активность в принудительном порядке, чтобы освободить ресурсы для других приложений, пользователь может снова вызвать эту активность с сохранённым предыдущим состоянием. Чтобы зафиксировать состояние активности перед её уничтожением, в классе активности необходимо реализовать метод onSaveinstancestate().

Сам метод вызывается прямо перед методом onPause(). Он предоставляет возможность сохранять состояние пользовательского интерфейса активности в объект Bundle, который потом будет передаваться в методы onCreate() и onRestoreInstanceState(). В объект Bundle можно записать параметры, динамическое состояние активности как пары «ключ-значение». Когда активность будет снова вызвана, объект Bundle передаётся системой в качестве параметра в методы onCreate() и onRestoreInstanceState(), которые вызываются после onStart(), чтобы один из них или они оба могли установить активность в предыдущее состояние. Прежде чем передавать изменённый параметр Bundle в обработчик родительского класса, сохраните значения с помощью методов putXXX() и восстановите с помощью getXXX().

Используйте обработчик onSaveInstanceState() для сохранения состояния интерфейса (например, состояния флажков, текущего выделенного элемента или введенных, но не сохранённых данных), чтобы объект Activity при следующем входе в активное состояние мог вывести на экран тот же UI. Рассчитывайте, что перед завершением работы процесса во время активного состояния будут вызваны обработчики onSaveInstanceState и onPause.

В отличие от базовых методов, методы onSaveInstanceState() и onRestoreInstanceState() не относятся к методам жизненного цикла активности. Система будет вызывать их не во всех случаях. Например, Android вызывает onSaveinstancestate() прежде, чем активность становится уязвимой к уничтожению системой, но не вызывает его, когда экземпляр активности разрушается пользовательским действием (при нажатии клавиши BACK). В этом случае нет никаких причин для сохранения состояния активности.

Метод onSaveInstanceState() вызывается системой в случае изменения конфигурации устройства в процессе выполнения приложения (например, при вращении устройства пользователем или выдвижении физической клавиатуры устройства.

Поскольку метод onSaveinstanceState() вызывается не во всех случаях, его необходимо использовать только для сохранения промежуточного состояния активности. Для сохранения данных лучше использовать метод onPause().

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

Сохранённый параметр Bundle передается методам onRestoreInstanceState() и onCreate(), если приложение принудительно перезапускается на протяжении сессии. В листинге показано, как извлечь значения из этого параметра и использовать их для обновления состояния экземпляра активности.

В API 28 метод вызывается после метода onStop(), в ранних версиях до метода onStop().

Метод onUserLeaveHint()

Позволяет отследить нажатие кнопки Home

Метод requestWindowFeature()

Метод позволяет задействовать дополнительные возможности для активности, например, выводить экран активности без заголовка. Примеры смотрите здесь.

Метод onWindowFocusChanged()

Метод позволяет определить момент получения фокуса вашим приложением.

Метод может быть полезен, так как он срабатывает позже метода onCreate(). Например, для вычисления размеров кнопки на экране этот метод предпочтительнее, так как уже известно, что все элементы загрузились и доступны, тогда как в onCreate() могут возвратиться пустые значения ширины и высоты кнопки. Пример использования.

Метод setContentView()

Изначально экран активности пуст. Чтобы разместить пользовательский интерфейс, необходимо вызвать метод setContentView(). У метода есть две перегруженные версии. Вы можете передать в параметре либо экземпляр компонента (View), либо идентификатор ресурса (наиболее распространённый способ).

Пример с использованием экземпляра компонента:

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

Метод setFeatureDrawableResource()

С помощью данного метода можно вывести значки в правой части заголовка. Смотри пример.

Метод setRequestedOrientation()

Метод позволяет программно изменить ориентацию экрана. Пример использования.

Метод startActivity()

Чтобы запустить новую активность, используется метод startActivity(Intent). Этот метод принимает единственный параметр — объект Intent, описывающий активность, которая будет запускаться. Смотри пример Activity.

Метод startActivityForResult()

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

Метод startActivityForResult(Intent, int) со вторым параметром, идентифицирующим запрос позволяет возвращать результат. Когда дочерняя активность закрывается, то в родительской активности срабатывает метод onActivityResult(int, int, Intent), который содержит возвращённый результат, определённый в родительской активности.

Метод setResult()

Когда активность завершится, вы можете вызвать метод setResult(int), чтобы возвратить данные назад в родительскую активность (до метода finish()). Этот метод возвращает код результата закрытия активности, который может быть стандартными результатами Activity.RESULT_CANCELED, Activity.RESULT_OK или определяемым пользователем результатом RESULT_FiRST_USER (можете придумать любую константу с целочисленным значением).

Если в дочерней активности есть кнопка отмены, то код может быть следующим:

Если метод finish() вызвать раньше метода setResult(), то результирующий код установится в RESULT_CANCELED автоматически, а возвращённое намерение покажет значение null.

Источник

Полный список

— сохраняем данные при повороте экрана

Теорию по этому вопросу можно почитать тут. Я здесь вкратце дам вольный перевод.

Эти методы используются в случаях, когда Activity уничтожается, но есть вероятность, что оно еще будет востребовано в своем текущем состоянии. Т.е. при нехватке памяти или при повороте экрана. Если же вы просто нажали кнопку Back (назад) и тем самым явно сами закрыли Activity, то эти методы не будут выполнены.

Но даже если не реализовать эти методы, у них есть реализация по умолчанию, которая сохранит и восстановит данные в экранных компонентах. Это выполняется для всех экранных компонентов, у которых есть ID.

Создадим простое приложение, чтобы протестить все эти тезисы. Посмотрим, в какой момент вызываются эти методы, попробуем в них что-нить сохранить. Также убедимся, что необходимо вызывать соответствующие методы супер-класса, чтобы сохранялись данные экранных компонентов.

Т.к. нам надо будет поворачивать экран, используйте при разработке Android 2.2. В AVD с версией 2.3 поворот глючит.

Project name: P0701_SaveInstanceState
Build Target: Android 2.2
Application name: SaveInstanceState
Package name: ru.startandroid.develop.p0701saveinstancestate
Create Activity: MainActivity

В strings.xml пропишем тексты:

В main.xml нарисуем кнопку и пару полей для ввода текста:

Обратите внимание, что второй EditText без ID.

В MainActivity будем вызывать все методы Lifecycle и два вышеописанных:

В каждом из них пишем лог, чтобы отследить последовательность вызовов. Метод onclick пока не реализуем.

Все сохраним и запустим. Введем в текстовые поля какие-нить данные:

savedinstancestate android что это. Смотреть фото savedinstancestate android что это. Смотреть картинку savedinstancestate android что это. Картинка про savedinstancestate android что это. Фото savedinstancestate android что это

и повернем экран CTRL+F12.

savedinstancestate android что это. Смотреть фото savedinstancestate android что это. Смотреть картинку savedinstancestate android что это. Картинка про savedinstancestate android что это. Фото savedinstancestate android что это

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

Эти три метода выполнились при запуске.

Затем мы повернули экран:

onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume

Первым делом вызывается onSaveInstanceState, здесь нам надо будет реализовывать сохранение своих данных. Далее идет уничтожение Activity (onPause, onStop, onDestroy) и создание нового onCreate, onStart. И перед onResume вызывается метод восстановления данных – onRestoreInstanceState.

Повернем эмулятор обратно в вертикальную ориентацию. Запустим приложение, и жмем на кнопку Count. Видим сообщение с кол-вом нажатий. Нажмем еще несколько раз, получим, например 5.

savedinstancestate android что это. Смотреть фото savedinstancestate android что это. Смотреть картинку savedinstancestate android что это. Картинка про savedinstancestate android что это. Фото savedinstancestate android что это

Теперь повернем экран и снова нажмем кнопку.

Мы видим, что счетчик сбросился.

savedinstancestate android что это. Смотреть фото savedinstancestate android что это. Смотреть картинку savedinstancestate android что это. Картинка про savedinstancestate android что это. Фото savedinstancestate android что это

Это произошло потому, что текущий объект Activity был уничтожен и потерял значения всех переменных, в том числе и cnt. При создании нового Activity значение cnt равно 0 и отсчет пошел заново. Давайте это пофиксим. Реализуем метод сохранения onSaveInstanceState:

В объект outState мы пишем значение переменной cnt. Механизм аналогичен помещению данных в Intent.

Метод восстановления onRestoreInstanceState:

Из savedInstanceState вытаскиваем значение и помещаем в переменную cnt. Теперь при уничтожении и воссоздании Activity переменная cnt сохранит свое значение, и наш счетчик продолжит работать.

Проверим. Вернем AVD в вертикальную ориентацию. Все сохраним, запустим приложение. Понажимаем на кнопку, немного накрутим счетчик

savedinstancestate android что это. Смотреть фото savedinstancestate android что это. Смотреть картинку savedinstancestate android что это. Картинка про savedinstancestate android что это. Фото savedinstancestate android что это

и поворачиваем экран.

savedinstancestate android что это. Смотреть фото savedinstancestate android что это. Смотреть картинку savedinstancestate android что это. Картинка про savedinstancestate android что это. Фото savedinstancestate android что это

счетчик не сбросился, а продолжил увеличиваться с последней позиции.

Итак, методы onSaveInstanceState и onRestoreInstanceState по дефолту сохраняют данные в экранных компонентах. Если мы реализуем их самостоятельно, то вызываем методы супер-класса и пишем свой код для своих переменных. Ради интереса, можете попробовать убрать вызовы методов суперкласса из onSaveInstanceState и onRestoreInstanceState. Данные в текстовом поле перестанут сохраняться при повороте экрана.

Кроме метода onRestoreInstanceState, доступ к сохраненным данным также можно получить в методе onCreate. На вход ему подается тот же самый Bundle. Если восстанавливать ничего не нужно, он будет = null.

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

onRetainNonConfigurationInstance – в нем мы сохраняем ссылку, передавая ее на выход (return) метода

Т.е., например, у нас есть какой то объект myObj (класс MyObject) и нам надо сохранить ссылку на него при повороте экрана.

Мы реализуем в Activity метод onRetainNonConfigurationInstance:

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

А, при создании нового Activity, в onCreate (например) мы используем метод getLastNonConfigurationInstance:

Мы получили обратно объект класса Object и привели его к нашему классу MyObject.

На следующем уроке:

— используем Preferences для работы с настройками приложения

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Как сохранить состояние активности Android с помощью сохранения состояния экземпляра?

Я работал над платформой Android SDK, и немного неясно, как сохранить состояние приложения. Итак, учитывая этот незначительный повторный инструментарий примера «Hello, Android»:

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

Я уверен, что решение так же просто, как переопределение onPause или что-то в этом роде, но я onPause в документации около 30 минут и не нашел ничего очевидного.

ОТВЕТЫ

Ответ 1

Вам нужно переопределить onSaveInstanceState(Bundle savedInstanceState) и записать значения состояния приложения, которые вы хотите изменить, в параметр Bundle например так:

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

Ответ 2

savedInstanceState предназначен только для сохранения состояния, связанного с текущим экземпляром Activity, например текущей информации о навигации или выборе, так что, если Android уничтожает и воссоздает Activity, он может вернуться, как было раньше. См. Документацию для onCreate и onSaveInstanceState

Для более долгого состояния рассмотрите возможность использования базы данных SQLite, файла или настроек. См. Сохранение постоянного состояния.

Ответ 3

Обратите внимание, что НЕ безопасно использовать onSaveInstanceState и onRestoreInstanceState для постоянных данных, в соответствии с документацией по состояниям активности в http://developer.android.com/reference/android/app/Activity.html.

В документе указано (в разделе «Жизненный цикл активности» ):

Обратите внимание, что важно сохранить постоянные данные в onPause() вместо of onSaveInstanceState(Bundle) потому что позднее не является частью обратные вызовы жизненного цикла, поэтому не будет в каждой ситуации, как описано в его документации.

РЕДАКТИРОВАТЬ. Для дальнейшего уточнения здесь onSaveInstanceState() документация:

Ответ 4

Мой коллега написал статью, объясняющую состояние приложения на устройствах Android, в том числе объяснения жизненного цикла активности и информации о состоянии, как хранить информацию о состоянии, а также сохранение в состояние Bundle и SharedPreferences и посмотрите здесь.

В статье рассматриваются три подхода:

Храните локальные переменные/данные управления пользовательским интерфейсом для времени жизни приложения (т.е. временно), используя пакет состояния экземпляра

Храните данные локальной переменной/управления пользовательским интерфейсом между экземплярами приложения (то есть постоянно), используя общие настройки

Сохранение экземпляров объекта в памяти между действиями в течение времени жизни приложения с использованием сохраненного экземпляра без конфигурации

Ответ 5

Это классическая разработка для Android. Здесь есть два вопроса:

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

Итак, если у вас есть сценарий, когда есть смысл «прогресса пользователя» или состояние, которое должно сохраняться между «запусками» вашего приложения, руководство должно использовать onPause и onResume. Вы должны сами выбрать и подготовить постоянный магазин.

В принципе, если ваше приложение запускается с флагом SingleTask, а затем вы запускаете его из главного экрана или меню запуска, то последующий вызов создаст новую задачу. у вас будет фактически два разных экземпляра вашего приложения, населяющего тот же стек. который очень странный очень быстро. Это происходит, когда вы запускаете свое приложение во время разработки (т.е. Из Eclipse или Intellij), поэтому разработчики часто сталкиваются с этим. Но также через некоторые механизмы обновления магазина приложений (так что это также влияет на ваших пользователей).

ОБНОВЛЕНИЕ Июнь 2013. Через несколько месяцев я наконец нашел правильное решение. Вам не нужно самостоятельно управлять любыми флагами с установленными состояниями, а вы можете обнаружить это из фреймворка и поручиться соответствующим образом. Я использую это в начале моего LauncherActivity.onCreate:

Ответ 6

onSaveInstanceState вызывается, когда система нуждается в памяти и убивает приложение. Он не вызывается, когда пользователь просто закрывает приложение. Поэтому я думаю, что состояние приложения также должно быть сохранено в onPause Оно должно быть сохранено в каком-то постоянном хранилище, например Preferences или Sqlite

Ответ 7

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

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

Ответ 8

Простой звонок после этого

Ответ 9

Я думаю, что нашел ответ. Позвольте мне рассказать, что я сделал простыми словами:

Предположим, что у меня есть два вида деятельности, activity1 и activity2, и я перемещаюсь из activity1 в activity2 (я сделал некоторые работы в activity2) и снова возвращаюсь к активности 1, нажимая на кнопку в Activity1. Теперь на этом этапе я хотел вернуться к активности2, и я хочу увидеть свою активность2 в том же состоянии, когда я последний раз оставил activity2.

В приведенном выше сценарии я сделал то, что в манифесте я сделал некоторые изменения следующим образом:

И в действии1 на событии нажатия кнопки я сделал вот так:

И в Activity2 при нажатии кнопки мыши я сделал следующее:

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

Я считаю, что это ответ, и это отлично работает для меня. Исправьте меня, если я ошибаюсь.

Ответ 10

onSaveInstanceState() для временных данных (восстановлено в onCreate() / onRestoreInstanceState() ), onPause() для постоянных данных (восстановлено в onResume() ). Из технических ресурсов для Android:

onSaveInstanceState() вызывается Android, если действие остановлено и может быть убито до его возобновления! Это означает, что он должен хранить любое состояние, необходимое для повторной инициализации в том же состоянии, когда операция перезапускается. Это аналог метода onCreate(), и на самом деле пакет savedInstanceState Bundle, переданный в onCreate(), представляет собой тот же Bundle, который вы создаете как outState в методе onSaveInstanceState().

onPause() и onResume() также являются бесплатными методами. onPause() всегда вызывается, когда действие завершается, даже если мы спровоцировали это (например, с вызовом finish()). Мы будем использовать это, чтобы сохранить текущую заметку в базе данных. Хорошая практика заключается в том, чтобы освободить любые ресурсы, которые могут быть выпущены во время onPause(), а также для уменьшения количества ресурсов в пассивном состоянии.

Ответ 11

Восстанавливая активность

Когда система начинает останавливать вашу деятельность, она вызывает onSaveInstanceState() (1), чтобы вы могли указать дополнительные данные состояния, которые вы хотите сохранить, в случае, если экземпляр Activity должен быть воссоздан. Если активность уничтожена и один и тот же экземпляр должен быть воссоздан, система передает данные состояния, определенные в (1), как методу onCreate() (2), так и методу onRestoreInstanceState() (3).

Сохранить состояние activity

Чтобы сохранить дополнительную информацию о состоянии вашей активности, вы должны реализовать onSaveInstanceState() и добавить пары ключ-значение в объект Bundle. Например:

Восстановить состояние activity

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

Например, здесь вы можете восстановить некоторые данные состояния в onCreate() :

Ответ 12

Действительно onSaveInstance state callen, когда Activity переходит в фоновый режим

Цитата из документов: «метод onSaveInstanceState(Bundle) вызывается перед тем, как помещать активность в такое фоновое состояние»

Ответ 13

Чтобы помочь уменьшить шаблон, я использую следующие interface и class для чтения/записи в Bundle для сохранения состояния экземпляра.

Сначала создайте интерфейс, который будет использоваться для аннотирования переменных экземпляра:

Затем создайте класс, в котором отражение будет использоваться для сохранения значений в комплекте:

Пример использования:

Примечание. Этот код был адаптирован из проекта библиотеки с именем AndroidAutowire, который лицензируется под Лицензия MIT.

Ответ 14

Между тем я вообще больше не пользуюсь

Жизненный цикл для большинства видов деятельности слишком сложен и не нужен.

И Google заявляет о себе, это даже не надежно.

В некотором смысле SharedPreferences работают аналогично Bundles. И естественно и сначала такие значения нужно читать из предпочтений.

В случае сложных данных вы можете использовать SQLite вместо предпочтений.

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

Ответ 15

Чтобы ответить на исходный вопрос напрямую. savedInstancestate имеет значение null, потому что ваша активность никогда не воссоздается.

Ваша активность будет воссоздана только с помощью пакета состояний, когда:

Android уничтожит фоновые действия, когда под давлением памяти или после того, как они были в фоновом режиме в течение длительного периода времени.

При тестировании вашего примера hello world есть несколько способов уйти и вернуться к Activity.

В большинстве случаев, если вы просто нажимаете на кнопку «домой», а затем снова запускаете приложение, активность не нужно будет воссоздавать. Он уже существует в памяти, поэтому onCreate() не будет вызываться.

В разделе «Настройки» → «Параметры разработчика» есть опция «Не выполнять действия». Когда он активирует Android, он всегда будет уничтожать действия и воссоздавать их, когда они основываются. Это отличный вариант оставить включенным при разработке, поскольку он имитирует худший сценарий. (Устройство с низкой памятью постоянно перерабатывает ваши действия).

Другие ответы ценны тем, что они учат вас правильным способам хранения состояния, но я не чувствовал, что они действительно ответили. ПОЧЕМУ ваш код не работал так, как вы ожидали.

Ответ 16

Ответ 17

Моя проблема заключалась в том, что я нуждался в постоянстве только в течение срока действия приложения (т.е. одно выполнение, включая запуск других под-действий в одном приложении и поворот устройства и т.д.). Я пробовал различные комбинации вышеупомянутых ответов, но не получал того, что хотел во всех ситуациях. В конце концов, что сработало для меня, было получить ссылку на savedInstanceState во время onCreate:

и использовать это для получения содержимого моей переменной, когда мне это нужно, в строках:

Ответ 18

Выполнение чего-то подобного Icecick:

То же самое, что и при этом:

Ответ 19

Когда создается действие, вызывается метод onCreate().

savedInstanceState является объектом класса Bundle, который является null в первый раз, но он содержит значения при его воссоздании. Чтобы сохранить состояние активности, вы должны переопределить onSaveInstanceState().

поместите свои значения в объект «outState» Bundle, такой как outState.putString( «ключ», «приветствие назад» ) и сохраните, вызвав super. Когда активность будет уничтожена, состояние будет сохранено в объекте Bundle и может быть восстановлено после отдыха в onCreate() или onRestoreInstanceState(). Пакет, полученный в onCreate() и onRestoreInstanceState(), одинаковый.

Ответ 20

Существует два способа реализовать это изменение.

Я действительно не рекомендую использовать второй метод. Поскольку в одном из моих опытов он вызывал половину экрана устройства черным при повороте от портрета к пейзажу и наоборот.

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

Пример. Рассмотрим случай, если вы хотите сохранить объект Json. создать класс модели с геттерами и сеттерами.

Теперь в вашей деятельности в методах onCreate и onSaveInstanceState выполните следующее. Он будет выглядеть примерно так:

Ответ 21

Вот комментарий от ответа Steve Moseley (ToolmakerSteve), который ставит все в перспективе (в целом onSaveInstanceState vs onPause, восточная стоимость и западная сага)

Ответ 22

а затем в onCreate() или onRestoreInstanceState()

Добавьте значения по умолчанию, если вы не хотите иметь опции

Ответ 23

Ответ 24

Сначала настройте библиотеку в app/build.gradle

Теперь давайте посмотрим нижеприведенный пример, как сохранить состояние в Activity

Он работает для операций, фрагментов или любого объекта, который должен сериализовать свое состояние на Bundle (например, ViewPresenters).

Icepick также может генерировать код состояния экземпляра для пользовательских представлений:

Ответ 25

Не уверен, что мое решение осуждается или нет, но я использую связанный сервис для сохранения состояния ViewModel. Храните ли вы его в памяти в службе или сохраняете и извлекаете из базы данных SQLite, зависит от ваших требований. Это то, что делают сервисы любого типа, они предоставляют такие сервисы, как поддержание состояния приложения и абстрактную общую бизнес-логику.

Этот подход дает вам дополнительный бонус за соблюдение принципа разделения интересов, заключающегося в том, что бизнес-логика всех ваших приложений может быть перенесена в ваш сервис, что сокращает дублирование логики между несколькими представлениями и позволяет представлению применять другой важный принцип проектирования, Single Responsibility.

Ответ 26

Котлин

График жизненного цикла

savedinstancestate android что это. Смотреть фото savedinstancestate android что это. Смотреть картинку savedinstancestate android что это. Картинка про savedinstancestate android что это. Фото savedinstancestate android что это

Хранить переменные

Получить переменные

Ответ 27

Теперь Android предоставляет ViewModels для сохранения состояния, вы должны попытаться использовать это вместо saveInstanceState.

Ответ 28

Добавление LiveData (компоненты архитектуры Android) в ваш проект

добавить следующую зависимость

LiveData принимает наблюдателя и уведомляет его об изменениях данных, только когда он находится в состоянии STARTED или RESUMED. Преимущество LiveData заключается в том, что когда ваша деятельность переходит в любое состояние, кроме STARTED или RESUMED, она не вызывает метод onChanged для наблюдателя.

Ответ 29

Что сохранить, а что нет?

Вы когда-нибудь задумывались, почему текст в EditText автоматически сохраняется при изменении ориентации? Ну, этот ответ для вас.

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

По умолчанию система сохраняет объекты View в Bundle, например.

Например, int currentScore в GameActivity

Более подробная информация о onSavedInstanceState (Bundle saveinstaneState) при сохранении данных

Так что по ошибке, если вы забудете вызвать super.onSaveInstanceState(savedInstanceState); поведение по умолчанию не будет работать, т.е. текст в EditText не будет сохранен.

Какой выбрать для восстановления состояния активности?

Оба метода получают один и тот же объект Bundle, поэтому не имеет значения, где вы пишете логику восстановления. Единственное отличие состоит в том, что в onCreate(Bundle savedInstanceState) вы должны будете дать нулевую проверку, пока она не нужна в последнем случае. Другие ответы уже содержат фрагменты кода. Вы можете отослать их.

Подробнее о onRestoreInstanceState (Bundle saveinstaneState)

Всегда вызывайте super.onRestoreInstanceState(savedInstanceState); чтобы система по умолчанию восстановила иерархию просмотра

бонус

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

Соответствующие ссылки:

Ответ 30

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *