OnCreate вызывается в действии A в верхней навигации

Итак, у меня есть Activity A и Activity B. Я хочу, чтобы Activity A мог перейти к Activity B нажатием кнопки. Это работает, но когда я использую навигацию вверх (кнопка "домой" в панели действий), чтобы перейти к Activity A, onCreate() вызывается снова, и старая информация, которую пользователь вводит, теряется.

Я видел: onCreate всегда вызывается, если перемещаться с намерением, но они использовали Фрагменты, и я надеюсь не переделывать все приложение на используйте фрагменты. Есть ли способ остановить onCreate() от вызова каждый раз, когда действие A снова активируется?

Ответ 1

Такое поведение совершенно и требует. Система может решить остановить Activities, которые находятся в фоновом режиме для освобождения некоторой памяти. То же самое происходит, когда, например, вращение устройства.

Обычно вы сохраняете свое состояние экземпляра (например, введенный текст и прочее) в связку и извлекаете эти значения из пакета при воссоздании Activity.

Вот некоторый стандартный код, который я использую:

private EditText mSomeUserInput;
private int mSomeExampleField;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // TODO inflate layout and stuff
    mSomeUserInput = (EditText) findViewById(R.id.some_view_id);

    if (savedInstanceState == null) {
        // TODO instanciate default values
        mSomeExampleField = 42;
    } else {
        // TODO read instance state from savedInstanceState
        // and set values to views and private fields
        mSomeUserInput.setText(savedInstanceState.getString("mSomeUserInput"));
        mSomeExampleField = savedInstanceState.getInt("mSomeExampleField");
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // TODO save your instance to outState
    outState.putString("mSomeUserInput", mSomeUserInput.getText().toString());
    outState.putInt("mSomeExampleField", mSomeExampleField);
}

Ответ 2

Вы можете заставить кнопку вверх вести себя как нажатие назад, переопределяя onSupportNavigateUp()

 @Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

Ответ 3

Если вы хотите переходить от дочернего к родительскому без воссоздания родительского (вызов метода onCreate), вы можете установить атрибут android:launchMode="singleTop" для родительской активности в AndroidManifest.xml