Почему состояние пользовательского интерфейса сохраняется, даже активность уничтожается и создается снова

#android

#Android

Вопрос:

Почему состояние пользовательского интерфейса сохраняется, даже если активность уничтожается и создается заново:

Мое действие имеет EditText, и если я напишу в нем какой-нибудь текст, например. ABC и когда я поворачиваю его, вызывается onDestroy, а затем onCreate (), поэтому Edittext должен быть пустым, но в нем все еще есть старый текст.

Моя Деятельность:

 public class MainActivity extends ActionBarActivity {


    protected void onCreate(Bundle savedInstanceState) {
        debugLog("(  ) Create called");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        debugLog("(  ) onResume called");
        super.onResume();
    }

    @Override
    protected void onPause() {
        debugLog("(  ) onPause called");
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        debugLog("(  ) onDestroy called");
        super.onDestroy();
    }

    private void debugLog(String str) {
        Log.d("SAMPLE APP",str);
    }
}
  

XML

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}"
    android:orientation="vertical"
    android:padding="15dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Name: "
        android:singleLine="true"
        android:textSize="16sp"
        android:textColor="#000000" />

    <EditText
        android:id="@ id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hobbies:"
        android:singleLine="true"
        android:textSize="16sp"
        android:textColor="#000000" 
        android:layout_marginTop="10dp"/>

    <CheckBox  
        android:id="@ id/checkBox1"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignParentLeft="true"  
        android:layout_alignParentTop="true"  
        android:text="Table Tennis" 
        android:layout_marginTop="10dp"/>  

</LinearLayout>
  

Войдите в систему при изменении ориентации:

 (  ) onDestroy called
(  ) onPause called
(  ) onCreate called
(  ) onResume called
  

Ответ №1:

По умолчанию система использует состояние экземпляра пакета для сохранения информации о каждом объекте просмотра в вашем макете действия (например, текстовое значение, введенное в объект EditText). Итак, если ваш экземпляр activity уничтожается и создается заново, состояние макета восстанавливается до его предыдущего состояния без какого-либо кода, требуемого вами. Однако в вашем действии может содержаться дополнительная информация о состоянии, которую вы хотели бы восстановить, например, переменные-члены, которые отслеживают прогресс пользователя в выполнении действия.

Примечание: Для того, чтобы система Android восстановила состояние представлений в вашей активности, каждое представление должно иметь уникальный идентификатор, предоставляемый атрибутом android: id.

Чтобы сохранить дополнительные данные о состоянии активности, вы должны переопределить метод обратного вызова onSaveInstanceState(). Система вызывает этот метод, когда пользователь покидает вашу активность, и передает ему объект Bundle, который будет сохранен в случае, если ваша активность неожиданно будет уничтожена. Если системе необходимо воссоздать экземпляр activity позже, она передает один и тот же объект Bundle методам onRestoreInstanceState() и onCreate().

Комментарии:

1. Таким образом, мы не должны беспокоиться о потере состояния пользовательского интерфейса, например, текста в edittext или состояния флажка, и нам не нужно сохранять их в onPause в настройках и т.д.

2. Ну, это зависит от того, воссоздает ли система Android вашу активность, тогда она будет восстановлена при условии, что вы указали атрибут android: id. Но если вы завершаете это самостоятельно или переходите к какой-либо другой деятельности, вам следует сохранить эти данные.

Ответ №2:

Android сохраняет содержимое некоторых виджетов по умолчанию, таких как EditText, до тех пор, пока у него есть идентификатор.

Комментарии:

1. Не могли бы вы, пожалуйста, поделиться документацией, подтверждающей ваш ответ… Я ничего не нашел в EditText.java где реализовано сохранение состояния

2. У @abhishesh есть более подробный ответ, чем у меня.