Android自动查看层次结构和onDestroy不一致?

时间:2016-03-11 17:38:20

标签: android android-activity bundle lifecycle

我注意到有些东西对于android的视图层次结构的打包/解包而言似乎很奇怪。我希望有人能为我澄清一切。

我了解任何观点,只要他们有指定的ID,就会自动捆绑其状态Great Ref. here。例如,当屏幕旋转然后向后旋转时,EditText将自动将其文本设置回原来的状态。我有一些相关的问题:

为什么在调用onDestroy之后,EditText会将其状态传递回onCreate。我在documented activity lifecycle中看不到从onDestroy到onCreate的路径。在我看来,如果它通过onStop返回onCreate,它可以恢复它的状态,但是一旦onDestroy被调用,就没有回到onCreate的路径。

为什么在屏幕旋转后,TextView 会记住其状态。这让我感觉非常类似于EditText的状态恢复。我猜测TextView没有实现自动捆绑其状态?

我还注意到,如果通过多次点击后退按钮来调用onDestroy,然后如果我通过长按中心按钮,然后选择应用程序来恢复应用程序,则不会保存应用程序包。这就是EditText和TextViews状态都被设置回初始文本。最后一部分是有道理的,因为onDestroy被调用了。

当屏幕旋转时,看起来onDestroy会被不同地调用,而后退按钮会多次被调用。

以下是来自简单测试应用程序的java源代码。我写的是为了证明。布局只有1个按钮,1个textview和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 个答案:

答案 0 :(得分:1)

当你通过轮换获得娱乐时,它实际上创建了一个全新的活动。您看到的图表的活动生命周期是针对单个活动的。轮换创建一个新的轮换。因此,没有从onDestroy到onCreate的路径,但是您正在使用原始Activity创建的Bundle变量从头创建一个新的Activity。

按下后退按钮时,您完成了()活动。你要退出了。当您选择退出活动时,不会保存捆绑包,下次启动时我们会使用干净的平板启动它。不调用onSaveInstanceState和onRestoreInstanceState。只有在计划稍后重新创建活动时才会调用这些活动 - 当活动因资源或配置更改而被杀死时。