Android活动实例状态

时间:2016-09-09 10:50:16

标签: android android-activity android-lifecycle android-configchanges android-savedstate

有什么意义:

super.onCreate(null);

而不是

super.onCreate(savedInstanceState);

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

我的问题是,我今后可以逍遥法外,或者在讨价还价中丢失一些东西吗?我真的不明白为什么会这样,无论是否安全,以及它对我的应用程序可能产生的意外影响。

我偶然发现了这个技巧here

相关问题:

Calling super.onCreate() with null parameter?

Will 'Bundle savedInstanceState' be alive after Application is being killed?

Activity state instance - insights?

Activity's instance state: what is automatically stored and restored

5 个答案:

答案 0 :(得分:2)

onCreate()在活动即将创建时首先调用,Android System还会管理活动生命周期,并可以通过保存其instanceState来终止活动,以防长时间未为用户关注活动并且系统处于低内存状态

An activity has essentially four states

super.onCreate(null):将始终在创建第一时间的同时创建活动,即使Android系统提供其saveInstanceState,也与定向配置无关。

super.onCreate(savedInstanceState):活动可以使用“ savedInstanceState”来重置其状态或上次使用的组件。

要达到这个目的,活动的实例状态必须保持不变,然后活动才能失去用户的注意力(可能是onStop或onDestroy)

savedInstaceState对于处理活动配置是否更改也很重要,请检查Configuration change上的活动生命周期行为

答案 1 :(得分:1)

  我在讨价还价中失去了一些东西吗?

仅当您正在使用片段时。参见Calling super.onCreate() with null parameter?

是的,onCreate(...)是启动活动所必需的,但是在处理片段时,需要将Bundle作为参数传递。

Read this

  

您从中推断出什么?

默认情况下,参数savedInstanceState始终为 null 。因此,您并没有真正失去任何讨价还价的机会。

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

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

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

现在,当其中一种配置更改时,MyActivity不会重新启动。而是,MyActivity收到对onConfigurationChanged()的调用。此方法将传递一个Configuration对象,该对象指定新的设备配置。通过阅读Configuration中的字段,您可以确定新的配置并通过更新界面中使用的资源来进行适当的更改。调用此方法时,活动的Resources对象将更新为基于新配置返回资源,因此您可以轻松重置UI的元素,而无需系统重新启动活动。

以下 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()期间将每个资源重新分配给每个元素。

答案 2 :(得分:0)

据我所知,很多数据都保存在包savedInstanceState中。 例如。您当前布局中的所有观看状态,例如任何EditTextCheckBox的当前内容。

您还可以查找一些official sources来检查是否需要保留一些数据。

Here's a nice article about it

基本上它表示所有View类都实现了方法onRestoreInstanceStateonSaveInstanceState,这些方法保存并恢复状态更改之前它们所处的任何临时状态。

答案 3 :(得分:-1)

  

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

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

答案 4 :(得分:-1)

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

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

快乐编码:)