10

有什么意义:

super.onCreate(null);

代替

super.onCreate(savedInstanceState);

Activity通过此更改,我能够避免每次发生配置更改(轮换、区域设置、权限切换)时困扰我的许多问题。似乎通过此更改,Activity只要配置更改触发它重新启动,就会重新启动。而且我这样做似乎并没有丢失任何数据或进程状态:所有 my Activitys 都完全恢复到它们以前的状态。

我的问题是,我以后可以不受惩罚地这样做,还是在讨价还价中失去一些东西?我真的不明白为什么会这样,它是否安全,以及它可能对我的应用程序产生什么意想不到的影响。

我在这里偶然发现了这个技巧。

相关问题:

使用 null 参数调用 super.onCreate()?

应用程序被杀死后,'Bundle savedInstanceState' 会存活吗?

活动状态实例 - 见解?

Activity的实例状态:自动存储和恢复什么

4

5 回答 5

2

onCreate() 在活动即将创建时首先调用,Android 系统管理活动生命周期并可以通过保存其 instanceState 来终止活动,以防活动长时间不关注用户并且系统处于内存不足的情况。

一个活动基本上有四种状态

super.onCreate(null):总是会在创建第一次时创建活动,即使是 Android 系统也提供了它的 savedInstanceState,与方向配置无关。

super.onCreate(savedInstanceState) : Activity 可以使用 'savedInstanceState' 将其状态或组件重置到上次的位置。

为了实现这一点,需要在活动失去用户注意力之前保持活动的实例状态(可能是 onStop 或 onDestroy)

如果活动配置发生更改,savedInstaceState 也很重要,请检查配置更改时的活动生命周期行为

于 2018-12-13T08:06:12.700 回答
1

在讨价还价中失去了什么?

仅当您使用 Fragments 时。请参阅使用 null 参数调用 super.onCreate()?

是的,启动 Activity 是必需的,但在使用片段时需要作为参数onCreate(...)传递。Bundle

读这个

你从中推断出什么?

savedInstanceState无论如何,该参数是null默认的。所以你在交易中并没有真正失去任何东西。

但是等等,我们通常Bundles用来保持方向变化,对吧?

以下清单代码声明了一个处理屏幕方向更改和键盘可用性更改的活动:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

现在,当这些配置之一发生更改时,MyActivity 不会重新启动。相反,MyActivity 收到对onConfigurationChanged(). 此方法传递一个配置对象,该对象指定新的设备配置。通过读取 中的字段Configuration,您可以确定新配置并通过更新界面中使用的资源进行适当的更改。在调用此方法时,Activity 的 Resources 对象会更新以根据新配置返回资源,因此您可以轻松地重置 UI 的元素,而无需系统重新启动您的 Activity。

以下onConfigurationChanged()实现检查当前设备方向:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

请记住当您声明您的活动以处理配置更改时,您有责任重置您提供替代方案的任何元素。如果您声明您的活动来处理方向更改并且具有应该在横向和纵向之间更改的图像,则必须在 onConfigurationChanged() 期间将每个资源重新分配给每个元素。

于 2018-12-13T08:21:45.423 回答
0

据我所知,很多数据都保存在 bundle 中savedInstanceState。例如,您当前布局中的所有视图状态,例如任何EditText或的当前内容CheckBox

您还可以查找一些官方来源以检查您是否需要保留一些数据。

这是一篇关于它的好文章

基本上它说所有View类都实现了方法onRestoreInstanceState and onSaveInstanceState,它们正在保存和恢复它们在状态更改之前所处的任何临时状态。

于 2016-09-09T11:00:12.277 回答
-1

每当您更改设备的旋转时,存储在类变量或局部变量中的所有数据都会丢失,但在您的活动中,只要用户输入任何数据,您似乎就没有存储任何数据,而是您可能在点击时读取数据一个按钮或类似的东西,您的活动将正常运行,并且所有用户输入(如 EditText 中的文本)将由 Android 自身恢复,因为它标识android:id="@+id/anyID"分配给每个视图的“ID”()并且可以自行恢复所有值由用户插入。

我希望这对你有帮助......

快乐编码:)

于 2018-12-12T06:15:30.257 回答
-1

是对 Bundle 对象的引用,该savedInstanceState对象被传递到onCreate每个 Android Activity 的方法中。在特殊情况下,活动能够使用存储在此捆绑包中的数据将自身恢复到以前的状态。

savedInstantState用于从保存在包中的 Intent 获取值非常重要。

于 2016-09-09T10:57:06.010 回答