Я заметил некоторые вещи, которые кажутся мне странными относительно упаковки и распаковки андроидов. Я надеюсь, что кто-то может прояснить мне все.Иерархия автоматического просмотра Android и непоследовательность onDestroy?
Я понимаю, что любые виды, если у них есть указанный идентификатор, автоматически свяжут их состояние, Great Ref. here. например, когда экран вращается и затем вращается назад, EditText автоматически вернет свой текст к тому, что было. Однако у меня есть несколько связанных вопросов:
Почему EditText возвращает свое состояние в onCreate после вызова onDestroy. Я не вижу пути от onDestroy до onCreate в documented activity lifecycle. Мне кажется, что он мог вернуть свое состояние, если он вернулся к onCreate через onStop, но как только onDestroy вызван, нет пути назад к onCreate.
Почему не TextView его состояние после поворота экрана. Это кажется мне очень похожим на EditText с восстановленным состоянием. Я предполагаю, что TextView просто не был реализован, чтобы автоматически связать его состояние?
Я также заметил, что если onDestroy вызывается путем нажатия кнопки «назад» несколько раз, а затем, если я верну приложение, например, на свой телефон, нажав центральную кнопку, затем выбрав приложение, пакет приложений не сохранены. Это и EditText, и состояния TextViews возвращаются к исходному тексту. Эта последняя часть имеет смысл, так как onDestroy был вызван.
Похоже, что onDestroy вызывается по-разному, когда экран повернут, а также когда кнопка назад нажата несколько раз.
Вот источник java из простого тестового приложения. что я написал, чтобы продемонстрировать. Макет - всего 1 кнопка, 1 текстовое изображение и 1 editview.
package com.example.sse.activitylifecycle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Button btnSetText;
private EditText editText;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState == null)
Log.i("myFLAG", "onCreate Called. NO BUNDLE PASSED");
else
Log.i("myFLAG", "onCreate Called. BUNDLE PASSED");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
editText = (EditText) findViewById(R.id.editText);
btnSetText = (Button) findViewById(R.id.btnSetText);
btnSetText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText.setText("Set Text"); //Text remembered, but only after rotation.
textView.setText("Set Text"); //Text NOT remembered.
}
});
}
@Override
protected void onRestart() {
Log.i("myFLAG", "onRestart Called.");
super.onRestart();
}
@Override
protected void onResume() {
Log.i("myFLAG", "onResume Called.");
super.onResume();
}
@Override
protected void onStart() {
Log.i("myFLAG", "onStart Called.");
super.onStart();
}
@Override
protected void onStop() {
Log.i("myFLAG", "onStop Called.");
super.onStop();
}
@Override
protected void onPause() {
Log.i("myFLAG", "onPause Called.");
super.onPause();
}
@Override
protected void onDestroy() {
Log.i("myFLAG", "onDestroy Called.");
super.onDestroy();
}
}
Это полезно, спасибо за это. Таким образом, поворот экрана действительно разрушит действие, но onSaveInstanceState будет вызван первым, чтобы создать пакет, прежде чем он будет уничтожен. Я с вами до сих пор. Затем будет запущена новая операция того же типа, и пул из исходной Activity будет передан ей. Каким образом пакет из первоначальной Activity будет передан в новую активность, и когда это произойдет, например, должно быть до onDestroy, или это после onDestroy первого действия. Я полагаю, что ОС Android управляет передачей пакета между действиями? – sse
Он проходит мимо рамки. Приложение не убивается, а только Activity. Статические синглтоны и тому подобное останутся. Он будет передан в двух местах: один раз в параметре Bundle в onCreate, тогда onRestoreInstanceState будет вызываться, передавая его снова. Итак, вы увидите onDestroy, onCreate, затем onRestoreInstanceState. Затем onStart и onResume. –
Это замечательно, спасибо. Поэтому в отношении TextView, не сохраняющего его состояние, как EditView, я считаю, что это действительно разница в представлении реализации этих компонентов. – sse