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

wan*_*nik 12 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

onCreate(): sn=1 n=1
Run Code Online (Sandbox Code Playgroud)

在我将屏幕旋转到风景后,我得到了:

onCreate(): sn=2 n=1
Run Code Online (Sandbox Code Playgroud)

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

onCreate(): sn=3 n=1
onCreate(): sn=4 n=1
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

Ted*_*opp 28

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

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

android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)

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

  • 我不得不用它来覆盖所有基础:`keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize` (3认同)

Aak*_*ash 10

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