gpt4 book ai didi

android - super.onCreate(savedInstanceState)中的savedInstanceState有什么用?

转载 作者:行者123 更新时间:2023-12-05 00:21:30 24 4
gpt4 key购买 nike

因此,我试图了解 Android 的内部工作原理,但我还没有找到对我正在寻找的内容的深入解释。对于我的简单程序:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

使用 null有什么区别?而不是 savedInstanceStatesuper.onCreate() ?我都试过了,我的程序没有区别。

如果有区别, savedInstanceState 的使用方式有哪些?影响我的程序,而不是使用 null ?

最佳答案

@sasikumar 评论中的链接问题/答案很好,并回答了为什么您必须调用 super.onCreate() ,但它没有回答为什么你必须通过 Bundle savedInstanceState super 调用的参数(与 new Bundle()null 相对)。

简单的答案是 savedInstanceState bundle 包含记录的信息由 Android 框架 然后 super 方法将用于恢复状态。例如,任何 EditTextandroid:id属性将自动保存用户输入的任何内容,该信息将在 savedInstanceState 中 bundle 。如果你传递null,这种自动恢复是不可能的。

请注意 savedInstanceState参数实际上是 null第一次创建您的 Activity 。只有当您的 Activity 被销毁并重新创建时,它才会是非空的(通常是为了响应配置更改,例如手机的旋转,但还有许多其他场景)。

更新

我的自动状态恢复示例不正确。 EditText自动恢复发生在 onRestoreInstanceState(Bundle savedInstanceState)回调,不在 onCreate .不幸的是,你不能简单地通过 null到那个 super 方法看看会发生什么(你的应用程序会崩溃)。

但是,这个例子将说明我的意思。假设您的 activity_main有一些FrameLayout ID 为 @+id/content ,并假设您有一些 Fragment显示对用户可见的任何内容的子类。尝试这个:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (savedInstanceState == null) {
getSupportFragmentManager()
.beginTransaction()
.add(R.id.content, new MyFragment(), "MyFragment")
.commit();
}
}

照原样,这将在第一次启动时显示您的 fragment ,并在您来回旋转设备后继续显示 fragment 。这是因为 FragmentManager使用 savedInstanceState用于保存/恢复 fragment 的 bundle ,以及 super.onCreate 中完成.

如果您将 super 调用更改为 super.onCreate(null) ,您仍然会在您的 Activity 第一次启动时看到该 fragment (因为我们当时手动添加它)。但是如果你旋转设备, fragment 就会消失。

关于android - super.onCreate(savedInstanceState)中的savedInstanceState有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47638655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com