Android应用程序方向更改会重新启动活动

4

我有一个活动,每当方向改变时它就会被重新启动。我已经在清单文件中编写了代码以防止方向改变时活动重启,如下所示:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.sample.appname.MainActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|keyboardHidden"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

在上面的代码片段中,android:configChanges="orientation|keyboardHidden"本来应该为我解决问题,但是活动仍然在重新启动。请告诉我如何更正。

除非你有非常充分的理由,否则不应尝试防止活动被重新创建。相反,你应该正确管理你的活动状态并将任何必要的状态保存在“onSaveInstanceState()”中,然后使用“onCreate()”中提供的“Bundle”适当地恢复状态。 - Karakuri
3个回答

9

实际上,你不应该阻止Activity重新启动。在旋转屏幕等情况下,重新创建Activity是必要的,因为有几个原因。其中之一是布局必须被填充以处理更改后的屏幕大小和其他类似的事情(可以想象,在纵向模式下,布局完全不同于横向模式)。 然而,有一种方法可以告诉系统你自己处理屏幕变化。因此,请更改您清单中的行

android:configChanges="orientation|keyboardHidden"

为了

android:configChanges="orientation|screenSize"

活动将不会被重新创建。您将通过onConfigurationChanged()方法获得回调,以便在方向更改时执行某些操作。如果您不想在配置更改时执行任何操作,请不要覆盖Activity中的onConfigurationMethod()。有关更多信息,请阅读Android Developers API指南中的此部分
我从这个答案中获取了这个信息。答案中还有两种方法,但我认为我上面描述的方法是您的最佳选择。 编辑:也许您还需要将keyboard|keyboardHidden添加到android:configChanges属性中,如此答案所述。
编辑#2:如果您想检索设备的当前方向,可以调用
Activity.getResources().getConfiguration().orientation

该函数将返回常量ORIENTATION_PORTRAITORIENTATION_LANDSCAPE

如果您对确切的旋转角度感兴趣,请使用

int rotation =  getWindowManager().getDefaultDisplay().getRotation();

可以使用类似于这里描述的开关语句实现差异化。

第三种确定设备旋转方向的方法是使用getRequestedOrientation(),它将返回文档中定义的常量


我们能否在onCreate事件中确定方向是否已更改? - user6118464
@MakeInIndia 我已经更新了我的答案,希望这可以帮到你。如果它帮助你解决了问题,请随意接受它。 - l7r7

0

android:configChanges="orientation|screenSize" 的意思是每当屏幕方向改变时,Activity类中的一个方法将被调用。

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

        if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { body }
    }

这是安卓的本质,每当屏幕方向改变时,整个活动的生命周期会再次运行。

为了保存和恢复一些数据,您可以使用以下方法。

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);

    outState.putString("key","value");
}

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

    String s = savedInstanceState.getString("key");

}

0

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