Когда вызывается onRestoreInstanceState?

Извините за мое непонимание, но я новичок в разработке Android.

У меня есть приложение с действием A и действием B, и я перехожу из действия A в действие B. Когда я покинул действие A, onSaveInstanceState метод был вызван, но когда я вернулся к операции A (из операции B в том же приложении), пакет в onCreate Метод был нулевым.

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

Может кто-то помочь мне с этим?

Вот мой код для Деятельности A:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null)
    {
        Log.v("Main", savedInstanceState.getString("test"));
    }
    else
    {
        Log.v("Main", "old instance");
    }
}  

@Override
public void onSaveInstanceState(Bundle savedInstanceState) 
{
    Log.v("Main", "save instance");

    savedInstanceState.putString("test", "my test string");

    super.onSaveInstanceState(savedInstanceState);
}


public void buttonClick(View view)
{
    Intent intent = new Intent(this, Activity2.class);
    startActivity(intent);
}

Вот мой код для занятия B, когда я нажимаю кнопку, чтобы вернуться к занятию A:

public void onBack(View view)
{
    NavUtils.navigateUpFromSameTask(this);
}

5 ответов

Решение

Сохранение и восстановление состояния предназначено для сохранения текущих временных данных, которые устарели при выходе пользователя из приложения. Когда вы минимизируете или покидаете действие, открывая следующее, оно может быть уничтожено системой из-за нехватки ресурсов и перезапущено с savedInstanceState когда ты вернешься к этому. Так что используйте onSaveInstanceState() только для сохранения минимизации-восстановления данных сеанса.

Таким образом, если вы начнете новое действие впереди и вернетесь к предыдущему (то, что вы пытаетесь сделать), действие A не может быть убито (просто остановлено) и перезапущено без уничтожения. Вы можете принудительно убить его и восстановить, проверив Don't keep activities в меню настроек разработчика.

Если вы позвоните finish() или удалите Activity из недавнего списка задач savedInstanceState не будет передан onCreate() так как задача была очищена.

Если значение должно быть постоянным, рассмотрите возможность использования SharedPreferences.

Чтобы ответить на ваш вопрос, взгляните на документацию для Android: https://developer.android.com/reference/android/app/Activity.html

В нем говорится, что onRestoreInstanceState вызывается после метода onStart() в жизненном цикле действия.

Справка

onSaveInstanceState

... onPause()-> onSaveInstanceState() -> onStop() -> onDestory()

onRestoreInstanceState

onCreate()-> onStart()-> onRestoreInstanceState()-> onPostCreate(Bundle) ...

Или вы можете использовать LiveData. Сохраните в нем состояния и наблюдайте. Если устройство вращается, оно соответствующим образом обновит представления.

Это происходит потому, что вы путешествуете трудным путем. Если вы использовали стандартную навигацию по кнопке "Назад", onCreate получит сверток

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

После onStart(), который после onCreate()

Я использовал в этом случае флаг и SharedPreferences. Это должно работать и при изменении ориентации экрана.

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