Что такое onCreate (Bundle savedInstanceState)

124

Может кто - нибудь помочь мне знать о Bundle savedInstanceStateв onCreate(Bundle savedInstanceState)я новичок в Android. Я пытаюсь понять это с сайта developer.android.com. Но я не могу понять. Кто-нибудь может это упростить?

user1077015
источник
2
Это хорошее видео: youtube.com/watch?v=kkYIMZw9gzQ
Франсиско Корралес Моралес,

Ответы:

106

Если вы сохраняете состояние приложения в пакете (обычно это непостоянные динамические данные onSaveInstanceState), его можно передать обратно, onCreateесли действие необходимо воссоздать (например, изменение ориентации), чтобы вы не потеряли это предыдущее Информация. Если данные не были предоставлены, savedInstanceStateимеет значение null.

... вы должны использовать метод onPause () для записи любых постоянных данных (например, изменений, внесенных пользователем) в хранилище. Кроме того, метод onSaveInstanceState (Bundle) вызывается перед помещением активности в такое фоновое состояние, позволяя вам сохранить любое динамическое состояние экземпляра в вашей деятельности в данном Bundle, чтобы впоследствии получить его в onCreate (Bundle), если действие необходимо воссоздать. См. Раздел «Жизненный цикл процесса» для получения дополнительной информации о том, как жизненный цикл процесса связан с действиями, которые он размещает. Обратите внимание, что важно сохранять постоянные данные в onPause () вместо onSaveInstanceState (Bundle), поскольку последний не является частью обратных вызовов жизненного цикла, поэтому не будет вызываться в каждой ситуации, как описано в документации.

источник

Дхрув Гайрола
источник
2
другие действия используют один и тот же пакет?, если я запускаю другое действие, передается ли он пакет из первого?
Франсиско Корралес Моралес,
17

onCreate(Bundle savedInstanceState)вы получите Bundleноль, когда активность начнется в первый раз, и она будет использоваться, когда ориентация активности изменится .......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android предоставляет еще один элегантный способ добиться этого. Чтобы добиться этого, мы должны переопределить вызываемый метод onSaveInstanceState(). Платформа Android позволяет пользователям сохранять любое состояние экземпляра. Состояние экземпляра можно сохранить в Bundle. Пакет передается как аргумент методу onSaveInstanceState.

мы можем загрузить сохраненное состояние экземпляра из Bundle, переданного в качестве аргумента onCreateметоду. Мы также можем загрузить сохраненное состояние экземпляра в onRestoreInstanceStatemethod. Но я оставлю это читателям на усмотрение.

Диреш Сингх
источник
11
savedInstanceStateне будет, nullесли onSavedInstanceState()ранее был вызван. изменение ориентации - только один пример, в котором это может произойти.
Alex Lockwood
1
@AlexLockwood, я пытаюсь продумать все ситуации, когда это могло произойти. Есть ли документация? Один случай, о котором я могу думать, - это если пользователь переключает приложения и возвращается, но действие было уничтожено для восстановления ресурсов. В этом случае android воссоздает действие с пакетом, если onSaveInsanceState () было переопределено, верно?
batbrat
1
@batbrat Да ... комментарий, который я сделал (почти два года назад), не совсем правильный. Я думаю, лучший способ выразить это - Bundleаргумент, который onCreate(Bundle)будет не nullтогда и только тогда, Activityкогда его onSaveInstanceStateметод был ранее вызван. Это происходит во время изменения ориентации ... а также происходит, когда активность возвращается после того, как ОС была убита, и когда вы запускаете любое другое интересующее изменение конфигурации на вашем устройстве.
Alex Lockwood
Спасибо за разъяснение, Алекс. Хорошо иметь некоторую ясность по этому поводу. Я забыл об изменениях конфигурации, кроме переключателей ориентации, в частности.
batbrat
15

Как ответил Дхрув Гайрола, вы можете сохранить состояние приложения, используя Bundle savedInstanceState. Я пытаюсь привести очень простой пример, который такие новые ученики, как я, могут легко понять.

Предположим, у вас есть простой фрагмент с TextView и Button. Каждый раз, когда вы нажимаете кнопку, текст меняется. Теперь измените ориентацию вашего устройства / эмулятора и обратите внимание, что вы потеряли данные (это означает, что данные изменились после щелчка, которые вы получили), и фрагмент снова запускается в первый раз. Используя Bundle savedInstanceState, мы можем избавиться от этого. Если вы посмотрите на жизненный цикл фрагмента. Fragment Lifecylce вы увидите, что метод onSaveInstanceState вызывается, когда фрагмент вот-вот будет уничтожен.

Итак, мы можем сохранить состояние, которое означает измененное текстовое значение в этом пакете, например

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

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

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

Теперь вы не потеряете свою ценность после ориентации. Измененное значение всегда будет отображаться.

Асад
источник
Обратите внимание, что это также верно для Activity. Не могли бы вы подробнее объяснить разницу между (Bundle of Activity) и Bundle of Fragment?
laalaguer
Вы можете получить четкое представление о жизненных циклах активности и фрагмента, в которых действие может отображать несколько фрагментов одновременно. Таким образом, основное отличие состоит в том, что вы можете захотеть сохранить некоторые значения для всех фрагментов действия, тогда вы сможете используйте набор действий, иначе вы должны использовать набор фрагментов, если он предназначен для определенного фрагмента.
Асад
5

onCreate (Bundle savedInstanceState) Функция в Android:

1) При первом вызове или запуске Activity метод onCreate (Bundle savedInstanceState) отвечает за создание активности.

2) Когда когда-либо ориентация (т. Е. С горизонтальной на вертикальную или с вертикальной на горизонтальную) изменяется или когда действие принудительно завершается любой операционной системой, то saveInstanceState, т.е. объект класса Bundle, сохранит состояние действия.

3) После изменения ориентации onCreate (Bundle savedInstanceState) вызовет и воссоздает действие и загрузит все данные из savedInstanceState.

4) В основном класс Bundle используется для хранения данных активности всякий раз, когда в приложении возникает вышеуказанное условие.

5) onCreate () не требуется для приложений. Но причина, по которой он используется в приложении, заключается в том, что этот метод - лучшее место для размещения кода инициализации.

6) Вы также можете поместить свой код инициализации в onStart () или onResume (), и когда ваше приложение загрузится первым, оно будет работать так же, как в onCreate ().

Аби
источник
4

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

psxls
источник
0

onCreate (Bundle savedInstanceState) вызывается, и savedInstanceState не будет иметь значения NULL, если ваша Activity была завершена в сценарии (визуальном представлении), описанном выше. Затем ваше приложение может захватить (перехватить) данные из saveInstanceState и восстановить вашу активность.

kabilan
источник