Що єСтворіть (Пакет збереженийInstanceState)


122

Хто-небудь може допомогти мені дізнатися про те, Bundle savedInstanceStateв чому onCreate(Bundle savedInstanceState)я новачок в Android. Я намагаюся зрозуміти це від developer.android.com. Але я не в змозі зрозуміти. Хтось може це спростити?


Відповіді:


106

Якщо ви зберігаєте стан програми в комплекті (як правило, непостійні, динамічні дані в onSaveInstanceState), його можна повернути назад, onCreateякщо активність потрібно відтворити (наприклад, зміна орієнтації), щоб ви не втратили цього попереднього інформація. Якщо дані не були надані, savedInstanceStateце недійсне значення.

... вам слід використовувати метод onPause () для запису будь-яких постійних даних (наприклад, правки користувачів) у сховище. Крім того, метод onSaveInstanceState (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 дозволяє користувачам зберігати будь-який стан примірника. Стан екземпляра можна зберегти в пакеті. Пакет передається як аргумент методу onSaveInstanceState.

ми можемо завантажити збережений стан екземпляра з пакету, переданого як аргумент onCreateметоду. Ми також можемо завантажити збережений стан екземпляра в onRestoreInstanceStateметод. Але я залишу це для читачів, щоб розібратися.


11
savedInstanceStateбуде не, nullякщо onSavedInstanceState()раніше було викликано. зміни орієнтації - лише один приклад, коли це може статися.
Алекс Локвуд

1
@AlexLockwood, я намагаюся продумати всі ситуації, в яких це може статися. Чи є документація? Я можу подумати про те, якщо користувач перемикає програми та повертається назад, але активність знищується для відновлення ресурсів. У цьому випадку android відновлює активність за допомогою пучка, якщо onSaveInsanceState () було перекрито, правда?
батбрат

1
@batbrat Так ... коментар, який я зробив (майже два роки тому), не зовсім коректний. Я думаю , що найкращий спосіб покласти це Bundleаргумент onCreate(Bundle)буде не- nullтоді і тільки тоді , коли Activityбуло це onSaveInstanceStateметод раніше називався. Це трапляється під час зміни орієнтації ... а також, коли активність повертається після вбивства ОС і коли ви запускаєте будь-яку іншу зміну конфігурації, що цікавить ваш пристрій.
Алекс Локвуд

Дякую за роз’яснення Алекс. Добре мати певну чіткість щодо цього питання. Я забув про зміни конфігурації, окрім перемикачів орієнтації, зокрема.
батбрат

15

Як відповів Dhruv Gairola, ви можете зберегти стан програми, використовуючи Bundle savedInstanceState. Я намагаюся навести дуже простий приклад, що нові учні, як я, можуть легко зрозуміти.

Припустимо, у вас є простий фрагмент з TextView та кнопкою. Кожен раз, коли ви натискаєте кнопку, текст змінюється. Тепер змініть орієнтацію вашого пристрою / емулятора і помітите, що ви втратили дані (означає змінені дані після натискання на вас) і фрагмент починається як перший раз. Використовуючи Bundle savedInstanceState, ми можемо позбутися цього. Якщо ви заглянете в життєвий цикл фрагмента. Фрагмент 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
    }
}

Тепер ви не втратите свою цінність після орієнтації. Змінене значення завжди відображатиметься.


Зауважте, що це також стосується активності. Чи можете ви пояснити більше про різницю (Пакет діяльності) та Розділ фрагмента?
laalaguer

Ви можете чітко зрозуміти життєві цикли діяльності та фрагменти, де діяльність може відображати кілька фрагментів одночасно. Отже, основна відмінність полягає в тому, що ви можете зберегти деякі значення для всіх фрагментів діяльності, тоді і буде використовуйте пакет активності, інакше u слід використовувати пакет фрагмента, якщо він призначений для конкретного фрагмента.
Асад

5

функція onCreate (Пакет збереженийInstanceState) в Android:

1) Коли перший виклик активності або запущений, а потім метод onCreate (Bundle saveInstanceState) відповідає за створення активності.

2) Коли коли-небудь орієнтація (тобто від горизонтальної до вертикальної або вертикальної до горизонтальної) діяльності змінюється або коли діяльність примусово припиняється будь-якою операційною системою, тоді saveInstanceState, тобто об'єкт класу Bundle, збереже стан активності.

3) Після зміни Орієнтації, тоді onCreate (пакет збереженихInstanceState) зателефонує та відтворить активність та завантажить усі дані з збереженогоInstanceState.

4) В основному клас Bundle використовується для зберігання даних про діяльність, коли в додатку виникає вищезазначений стан.

5) onCreate () не потрібен додаткам. Але причина, яку він використовує в додатку, полягає в тому, що саме цей метод є найкращим місцем для розміщення коду ініціалізації.

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


4

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


0

onCreate (Пакет збереженихInstanceState) викликає, і збереженеInstanceState буде недійсним, якщо ваша активність і вона була припинена у сценарії (візуальний вигляд), описаному вище. Потім ваш додаток може захопити (виловити) дані з збереженогоInstanceState і відновити свою активність

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.