Android App方向更改会重新启动活动

时间:2016-03-26 18:27:16

标签: android

我有一项活动,只要方向发生变化,它就会重新启动。我已编写代码以防止在清单文件中更改方向时重新启动活动,如下所示:

<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”应该为我做的工作,但活动仍在重新启动。请让我知道如何纠正它。

3 个答案:

答案 0 :(得分:5)

实际上,您不应该阻止重新启动活动。由于多种原因,在轮换更改后重新创建活动是必要的。其中之一是布局必须膨胀以处理改变的屏幕尺寸和类似的东西(很容易想象布局在纵向上完全不同于横向模式)。 但是,有一种方法可以告诉系统您自己处理屏幕更改。因此,更改清单中的行

android:configChanges="orientation|keyboardHidden"

android:configChanges="orientation|screenSize"

然后不会重新创建活动。您将通过onConfigurationChanged()方法获得回调,以便在方向发生变化时执行某些操作。如果您在配置更改时不想执行任何操作,请不要覆盖“活动”中的onConfigurationMethod()。请阅读this section in the Android Developers API Guide以获取更多信息。

我是从this answer得到的。答案还有两种方法,但我认为上面描述的方法在你的案例中是最好的。

编辑:也许您必须将keyboard|keyboardHidden添加到android:configChanges属性中,如this answer中所述

编辑#2:如果您想要检索设备的当前方向,可以拨打

Activity.getResources().getConfiguration().orientation

将返回常量ORIENTATION_PORTRAITORIENTATION_LANDSCAPE

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

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

并使用描述here的开关案例来实现差异化。

确定设备旋转的第三种方法是getRequestedOrientation(),它将返回the documentation中定义的常量

答案 1 :(得分:0)

android:configChanges =“orientation | screenSize”表示无论何时更改屏幕方向,都会调用Activity类中的以下方法。

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

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

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

保存并恢复某些数据。你可以使用以下方法。

@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");

}

答案 2 :(得分:0)

尝试更改

android:configChanges="orientation|keyboardHidden"

进入

android:configChanges="orientation|screenSize"

这应该可以解决您的问题,但这不是一种有效的方法,更好的选择参考http://developer.android.com/training/basics/activity-lifecycle/recreating.html