Android SaveInstanceState - Понимание

С этой страницы Android SDK

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

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

Например, действие A вызвало действие B. В действии B у меня есть чекбоксы, радиокнопки и т. Д. Пользователь выбирает свой выбор и нажимает кнопку "Назад". Я показываю активность. На данный момент я хочу сохранить выбор пользователя. Когда пользователь снова возвращается из действия А в В, нажав кнопку, я бы хотел, чтобы все варианты сохранялись. Один из способов, который я могу придумать, это установить флаг намерения, чтобы вывести активность на передний план. Но не рекомендуемый метод, я думаю.

Так есть ли реализация по умолчанию для сохранения состояния в соответствии с приведенным выше текстом из SDK? Или, может быть, я неправильно понимаю?

4 ответа

Решение

onSaveInstanceState() а также onRestoreInstanceState() Android явно вызывается только когда Activity необходимо воссоздать, как правило, после изменения конфигурации (например, изменение ориентации). Это не распространяется на случай, когда вы вызвали новый экземпляр Activity, Когда вы нажимаете кнопку "Назад", действие B уничтожается, и вы создаете его новый экземпляр при следующем запуске. Activity,

Если вы хотите вручную сохранить экземпляр Activity, вызвать действие B через startActivityForResult(), Затем в Деятельности B переопределите onDestroy() метод, и вызовите эти строки кода:

@Override
protected void onDestroy() {

    Bundle savedState = new Bundle();
    onSaveInstanceState(savedState);
    Intent data = new Intent();
    data.putExtra("savedState", savedState);
    setResult(RESULT_OK, data);

    super.onDestroy();
}

В упражнении А переопределите onActivityResult и сохраните данные:

Bundle activityBData;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK) {
        activityBData = data.getBundleExtra("saved_state");
    }
}

Затем при повторном запуске действия B назовите его так:

Intent intent = new Intent(this, ActivityB.class);
if (activityBData != null) {
    intent.putExtra("saved_state", activityBData);
}
startActivityForResult(intent, 0);

И, наконец, в Деятельности B onCreate Способ восстановления состояния:

if (savedInstanceState == null) {
    Intent intent = getIntent();
    Bundle savedState = intent.getBundleExtra("saved_state");
    onRestoreInstanceState(savedState);
}

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

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

В общем, как указано в документации для onRestoreInstanceState():

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

Например: из B вы вызываете startActivity(A). Затем из A вы вызываете finish(), чтобы вернуться к B. В этом случае ваше первое действие B не будет уничтожено, и не будут вызываться ни onCreate(), ни onRestoreInstanceState(). Эти методы вызываются только тогда, когда это необходимо, то есть когда действие было уничтожено и должно быть воссоздано системой.

Используйте механизм SharedPreferences. Ознакомьтесь с документацией: https://developer.android.com/reference/android/content/SharedPreferences Пример реализации: https://www.tutorialspoint.com/android/android_shared_preferences.htm Также вы можете использовать PreferenceFragment для упростить эту задачу

Другие вопросы по тегам