Android 自动视图层次结构和 onDestroy 不一致?

Android Automatic View Hierarchy and onDestroy inconsistency?

我注意到一些关于 android 的 packing/unpacking 视图层次结构对我来说似乎很奇怪的事情。我希望有人能为我澄清一些事情。

我了解任何视图,只要它们指定了 ID,就会自动将其状态捆绑起来,Great Ref. here。例如,当屏幕旋转然后旋转回来时,EditText 将自动将其文本设置回原来的状态。但是我有几个相关的问题:

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

为什么 TextView 记住屏幕旋转后的状态。这让我觉得与恢复状态的 EditText 非常相似。我猜 TextView 只是没有实现自动绑定其状态?

我还注意到,如果通过多次点击后退按钮调用 onDestroy,然后如果我返回应用程序,例如,在我的 phone 上长按中间按钮,然后选择应用程序,应用程序包未保存。即 EditText 和 TextViews 状态都设置回其初始文本。最后一部分是有道理的,因为调用了 onDestroy。

在屏幕旋转时调用 onDestroy 的方式与多次点击后退按钮时调用的方式不同。

这是来自简单测试应用的 java 来源。我写的是为了证明。布局只有 1 个按钮、1 个文本视图和 1 个编辑视图。

 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();
    }
}

当您通过轮换获得娱乐时,它实际上创造了一个全新的 Activity。您看到的图表的 Activity 生命周期是针对单个 Activity 的。旋转创建一个新的。所以没有从 onDestroy 到 onCreate 的路径,但是您正在使用由原始 Activity.

创建的 Bundle 变量从头开始创建一个新的 Activity

点击后退按钮时,您就完成了 Activity。你正在退出它。当您选择退出 Activity 时,不会保存 Bundle,下次您启动它时,我们会从头开始。不会调用 onSaveInstanceState 和 onRestoreInstanceState。只有当计划稍后重新创建 Activity 时才会调用这些 - 当 Activity 因资源或配置更改而被杀死时。