Android屏幕旋转导致活动重启

1459
在我的Android应用中,当我旋转设备(推出键盘)时,我的Activity会被重新启动(调用onCreate)。现在,这可能是预期的行为,但我在onCreate方法中进行了很多初始设置,因此我需要:
  1. 将所有初始设置放在另一个函数中,以便设备旋转时不会丢失它们。
  2. 使onCreate不再被调用,仅调整布局。
  3. 将应用限制为仅支持竖屏模式,这样就不会调用onCreate

4
这篇博客文章中详细解释了如何在活动组件配置更改时保留长时间运行的异步任务,点击此处阅读。 - Adrian Monk
3
这不是一个直接的答案,因为其他人已经回答了,但我邀请您查看LogLifeCycle,以了解您的Android应用程序在生命周期方面发生了什么。 - Snicolas
34个回答

0

有很多方法可以做到这一点:

  • 在 onCreate 中使用 Flag

    在您的清单文件中添加以下行


> android:screenOrientation="portrait"

并且在onCreate()中

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  • 使用 onConfigurationChanged() 方法

在您的清单文件中添加以下行 / 适用于 Android 3.2 及更高版本

     


android:configChanges="keyboardHidden|orientation" / android:configChanges="keyboardHidden|orientation|screenSize"

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

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //Handle rotation from landscape to portrait mode here
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        //Handle rotation from portrait to landscape mode here
    }
}
  • 使用 onSaveInstanceState()

    @Override public void onSaveInstanceState(Bundle outState) { /在此处保存要恢复的数据 例如:outState.putLong("time_state", time);,其中 time 是一个 long 变量/ super.onSaveInstanceState(outState); }

并进行恢复

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

if(savedInstanceState!= null){
   /*When rotation occurs
    Example : time = savedInstanceState.getLong("time_state", 0); */
} else {
  //When onCreate is called for the first time
}

}


0

在该活动集中,像下面这样进行配置更改

 android:configChanges="orientation|screenSize|keyboardHidden"

0

将此代码添加到您的 manifest.xml 文件中。

这是您的活动内容。

<activity
....
..
android:configChanges="orientation|screenSize"/>

0

您可以使用以下代码锁定屏幕的当前方向...

int currentOrientation =context.getResources().getConfiguration().orientation;
        if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
            ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            ((Activity) context). setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接