旋转设备后,onCreate(...)被调用两次

时间:2011-11-07 03:33:42

标签: android

我对旋转Android设备有疑问。我的代码在onCreate(...)中记录了一个静态和非静态属性。

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    static int sn;
    int n;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        sn++;
        n++;

        Log.i("onCreate", String.format("sn=%d n=%d", sn, n));
    }
}

屏幕方向为纵向。当我第一次运行代码时,我得到了:

onCreate(): sn=1 n=1

将屏幕旋转到横向后,我得到了:

onCreate(): sn=2 n=1

在我再次将屏幕旋转为肖像后,我得到了:

onCreate(): sn=3 n=1
onCreate(): sn=4 n=1

我的问题是:

  1. 当设备旋转回肖像时,如何防止onCreate(...)被调用两次?
  2. 如何在旋转设备时保存非静态变量的值?

6 个答案:

答案 0 :(得分:28)

这是模拟器中的已知问题(请参阅讨论here)。这不是一个错误,但对于许多人来说,这是一个问题。据我了解,基本问题是,当您的活动进入纵向模式时,它会重新启动两次,因为模拟器分别处理两个配置更改:方向更改本身和键盘取消激活。它不会发生在另一个方向,因为没有与键盘激活相对应的配置更改事件。 (我发现这很奇怪,但显然这是出于某种原因所希望的行为。)

无论如何,解决方案似乎是将此添加到您的活动清单声明中:

android:configChanges="keyboardHidden|orientation"

如果您确实需要这些更改来加载新资源,您可以在onConfigurationChanged中手动处理它。

答案 1 :(得分:10)

每当更改屏幕方向时,该活动都会被销毁,新活动将以onCreate()方式启动。 因此,每次旋转屏幕时,活动都将被销毁,新活动将以onCreate()方法开始。 您可以通过覆盖onSaveInstanceState(Bundle b)方法来保存非静态成员。 每当屏幕旋转时Android都会调用此方法,并且给定的包b将传递给oncreate(Bundle b),您可以从中提取非static成员。

答案 2 :(得分:3)

不了解onCreate问题;那些电话来自操作系统。

非静态(“实例”)变量应保存在instanceState;这就是它的用途。请参阅总结的posts like this,或讨论应用程序生命周期的大多数基本Android教程。

答案 3 :(得分:1)

这很简单:您可以在代码中覆盖onConfigurationChanged()方法。

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

    }

所以现在你的非静态变量不会受到影响,因为在这段时间你的Activity不会被销毁,而且新的活动也不会被onCreate()方法启动。

答案 4 :(得分:0)

每次旋转屏幕活动都会被重新创建 - 这是android的概念。

但是在你的情况下,当活动重新创建时,静态值将被保留..而non static将被重新初始化...所以你总是得到n=1 ......

如果您真的想保留非静态值,请转到Shared Preferences。在此,您可以保留所需的所有值,直到用户清除数据....

否则只需将non static设为static即可解决您的猜测

答案 5 :(得分:0)

将此行放在AndroidManifest.xml文件中的活动中:

android:launchMode="singleInstance"

来自Documentation

  

" singleTask"和" singleInstance"活动只能开始一项任务。   它们始终位于活动堆栈的根部。而且,   设备一次只能容纳一个活动实例 - 只有一个   这样的任务。

     

A" singleInstance"另一方面,活动不允许其他活动   活动成为其任务的一部分。它是该任务中唯一的活动。   如果它启动另一个活动,则将该活动分配给a   不同的任务 - 好像FLAG_ACTIVITY_NEW_TASK在意图中。

相关问题