Вопрос по android – Android SaveInstanceState - Понимание

0

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

The default implementation takes care of most of the UI per-instance state for you by calling onSaveInstanceState() on each view in the hierarchy that has an id, and by saving the id of the currently focused view (all of which is restored by the default implementation of onRestoreInstanceState(Bundle)).

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

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

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

видеть этоstackoverflow.com/a/151940/985143 Zaz Gmy

Ваш Ответ

4   ответа
1

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

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

Most implementations will simply use onCreate(Bundle) to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation. The default implementation of this method performs a restore of any view state that had previously been frozen by onSaveInstanceState(Bundle).

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

3

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 'sonCreate Способ восстановления состояния:

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

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

2

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

Похожие вопросы