2016-03-11 3 views
0

Я заметил некоторые вещи, которые кажутся мне странными относительно упаковки и распаковки андроидов. Я надеюсь, что кто-то может прояснить мне все.Иерархия автоматического просмотра 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(); 
    } 
} 

ответ

1

Когда вы получаете возможность отдыха через ротацию, на самом деле создаете совершенно новое действие. Жизненный цикл активности, для которого вы видите диаграммы, предназначен для одного действия. Вращение создает новый. Таким образом, нет пути от onDestroy до onCreate, но вы создаете новый Activity с нуля с этой переменной Bundle, созданной исходной Activity.

При нажатии кнопки «Назад» вы завершаете действие. Вы выходите из него. Когда вы решите выйти из Activity, Bundle не будет сохранен, и при следующем запуске мы начнем его с чистого листа. onSaveInstanceState и onRestoreInstanceState не вызываются. Эти вызовы вызываются только тогда, когда план состоит в том, чтобы воссоздать действие позже - когда действие уничтожается для изменения ресурсов или конфигурации.

+0

Это полезно, спасибо за это. Таким образом, поворот экрана действительно разрушит действие, но onSaveInstanceState будет вызван первым, чтобы создать пакет, прежде чем он будет уничтожен. Я с вами до сих пор. Затем будет запущена новая операция того же типа, и пул из исходной Activity будет передан ей. Каким образом пакет из первоначальной Activity будет передан в новую активность, и когда это произойдет, например, должно быть до onDestroy, или это после onDestroy первого действия. Я полагаю, что ОС Android управляет передачей пакета между действиями? – sse

+0

Он проходит мимо рамки. Приложение не убивается, а только Activity. Статические синглтоны и тому подобное останутся. Он будет передан в двух местах: один раз в параметре Bundle в onCreate, тогда onRestoreInstanceState будет вызываться, передавая его снова. Итак, вы увидите onDestroy, onCreate, затем onRestoreInstanceState. Затем onStart и onResume. –

+0

Это замечательно, спасибо. Поэтому в отношении TextView, не сохраняющего его состояние, как EditView, я считаю, что это действительно разница в представлении реализации этих компонентов. – sse

 Смежные вопросы

  • Нет связанных вопросов^_^