OnSaveInstanceState() и пакет

Это о пустоте onSaveInstanceState (Bundle saved) и фундаментальной концепции Java.

Перед вызовом этого метода должен быть создан объект Bundle, затем он передается этому методу. Пусть говорят, что он создан и передан так:

Bundle savedInstanceState= new Bundle();
onSaveInstanceState(savedInstanceState);

Этот метод сохраняет данные в этом пакете. Но он не возвращает этот пакет (к которому он добавил пары имя-значение).

public void onSaveInstanceState(Bundle saved){
. . . //data added to the bundle named saved
}

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

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

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

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

2 ответа

Итак, скажем, вы переопределяете метод onSaveInstanceState в своей настраиваемой активности, примерно так:

public void onSaveInstanceState(Bundle dataToBeSaved) {
 super.onSaveInstanceState(dataToBeSaved);
 dataToBeSaved.putString("myKey", "myImportantStringValue"); 
 //populate bundle with more data
}

Вот что происходит (упрощается), когда ваша активность убивается и у вас есть возможность сохранить некоторые данные:

  • Система Android создаст Bundle data = new Bundle(); как вы правильно заявили в своем вопросе.
  • Android вызовет вашу activity.onSaveInstanceState(data); передавая ссылку на только что созданный объект Bundle.
  • ваш метод onSaveInstance получает копию этой ссылки (называемой dataToBeSaved внутри вашего метода). Обратите внимание, что эта ссылка (и ее копия) относится к объекту Bundle управляемому системой. Таким образом, ваш метод будет заполнять этот объект Bundle управляемый системой.
  • Система сохраняет измененный объект Bundle во время перезапуска вашей активности
  • Когда ваша активность вернется, система вызовет вашу activity.onCreate(data); передавая [ссылку на] этот ранее сохраненный Bundle
  • В вашем onCreate() вы получаете ссылку на объект Bundle с тем же контентом, который вы получили в onSaveInstanceState() [ комментарий на основе редактирования ] Вы получите ссылку на точно такой же Bundle или его повторно созданный дубликат в зависимости от того, как система управляет памятью между перезагрузкой активности/процесса, и это не имеет значения для разработчика.

Надеюсь, что это разъяснит вам.


Основываясь на вашем вопросе:

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

Я думаю, что вы полностью упускаете всю суть самого метода, даже за пределами параметра, который берет, и дает вам возможность собрать некоторую информацию, которая может вас заинтересовать после воссоздания, точка этого метода должна сообщить вам, что механизм, который может заставить объект потерять его состояние вот-вот начнется. Например, вы можете заметить, что метод выполняется, когда ваше устройство повернуто, а "отдых" активности влияет на текущее состояние объектов, что дает вам возможность сохранять информацию и использовать ее в "onRestoreInstanceState", также вы могли заметить, что если вы нажмете назад и закроете действие, оно НЕ будет выполнено, потому что вы больше не заботитесь об этих объектах, так что помимо того, что вы получаете в комплекте (который является вашей ответственностью за заполнение), важность этого метод должен сообщить вам, что что-то, что испортит ваше состояние, вот-вот начнется, и вы должны принять ваши меры предосторожности...

Надеюсь, это уточнит ваш вопрос...

С уважением!

licensed under cc by-sa 3.0 with attribution.