Рабочий пример кода с onRestoreInstanceState

319
03 мая 2017, 08:55

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

Никак не могу понять логики работы методов onSaveInstanceState и onRestoreInstanceState - метод onSaveInstanceState вроде отрабатывает а Bundle - нулевой.

Answer 1

Метод onSaveInstanceState(...) вызывается между onPause() и onStop() и служит для сохранения данных (упаковки их в объект типа Bundle).

Метод onRestoreInstanceState(...) вызывается после onStart() и служит для восстановления данных (распаковки их из объекта типа Bundle). Данный метод вызывается только в том случае, если данные были сохранены (следовательно, проверка на savedInstanceState != null здесь не нужна).

Также, сохраненные данные можно восстановить в методе onCreate(...) (в большинстве кейсов их восстанавливают именно здесь).

Вот пример с восстановлением данных в onCreate(...):

public class MainActivity extends AppCompatActivity {
    private static final String VALUE_KEY = "Value";
    private int mValue;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState != null) {
            mValue = savedInstanceState.getInt(VALUE_KEY);
        } else {
            mValue = 1;
        }
        Toast.makeText(this, "Value: " + mValue, Toast.LENGTH_SHORT).show();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mValue = 2;
        outState.putInt(VALUE_KEY, mValue);
    }
}

При запуске приложения отобразится значение 1, далее, например, если повернуть экран, то на экране появится значение 2.

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

Нижеследующий пример демонстрирует восстановление данных с помощью метода onRestoreInstanceState(...):

public class MainActivity extends AppCompatActivity {
    private static final String VALUE_KEY = "Value";
    private int mValue;
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mValue = savedInstanceState.getInt(VALUE_KEY);
        Toast.makeText(this, "Value: " + mValue, Toast.LENGTH_SHORT).show();
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (savedInstanceState == null) {
            mValue = 1;
        }
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mValue = 2;
        outState.putInt(VALUE_KEY, mValue);
    }
}

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

READ ALSO
Как подключить документацию javadoc к проекту

Как подключить документацию javadoc к проекту

Расскажите как получить документацию к Yandex MapKit? Из информации в issue говорят "Документация и бибилотека доступна через gradle"

494
помогите составить код в java ide [требует правки]

помогите составить код в java ide [требует правки]

Дано целое число N (> 0)Найти значение выражения 1

288
Как в класс ObjectOutputStream добавить логирование?

Как в класс ObjectOutputStream добавить логирование?

Как в класс ObjectOutputStream добавить логированиеОн стандартный и открыватеся только на чтение

283
java.lang.NullPointerException at android.content.ContextWrapper.getPackageName

java.lang.NullPointerException at android.content.ContextWrapper.getPackageName

Здравствуйтеподключаю api twitter в приложении

331