【问题标题】:Android Automatic View Hierarchy and onDestroy inconsistency?Android Automatic View Hierarchy 和 onDestroy 不一致?
【发布时间】:2016-03-11 17:38:19
【问题描述】:

关于 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 个文本视图和 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();
    }
}

【问题讨论】:

    标签: android android-activity bundle lifecycle


    【解决方案1】:

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

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

    【讨论】:

    • 这很有帮助,谢谢。因此,屏幕旋转确实会破坏活动,但 onSaveInstanceState 将首先被调用以在它被破坏之前创建一个包。到目前为止,我和你在一起。然后将实例化一个相同类型的新 Activity,并将原始 Activity 的捆绑包传递给它。原始 Activity 的捆绑包如何传递给新的 Activity,何时发生,例如必须在 onDestroy 之前,还是在第一个 Activity 的 onDestroy 之后。我认为 Android 操作系统管理活动之间的捆绑包的传递?
    • 它被框架传递。应用程序没有被杀死,只是 Activity。所以静态单例等将保留。它将在两个地方传递——一次在 Bundle 参数中传递给 onCreate,然后将调用 onRestoreInstanceState 再次传递它。因此,您将看到 onDestroy、onCreate,然后是 onRestoreInstanceState。然后是 onStart 和 onResume。
    • 太完美了,非常感谢。所以关于TextView不像EditView那样存储它的状态,我认为这确实只是这些组件的View实现的不同。
    • 这也与ids有关。只有带有 id 的元素会自动正确保存。两个项目都有id吗?我不知道确切的实现,但想象一下它用于恢复的 id->properties 映射。
    • textview 肯定有一个ID。不过,我不太担心这一点。再次感谢。
    猜你喜欢
    • 2018-11-01
    • 2022-12-02
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多