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

Android应用程序方向更改重新启动活动,android,Android,我有一个活动,每当方向改变,它就会重新启动。我编写了代码,以防止在清单文件中的方向发生更改时重新启动活动,如下所示: <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity an

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

<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”应该为我完成这项工作,但活动仍在重新启动。请告诉我如何更正。

实际上,您不应该阻止活动重新启动。出于多种原因,在旋转更改后有必要重新创建活动。其中之一是布局必须膨胀,以应对变化的屏幕大小和诸如此类的事情(很容易想象,纵向布局与横向模式完全不同)。 但是,有一种方法可以告诉系统您自己处理屏幕更改。因此,请更改清单中的行

android:configChanges="orientation|keyboardHidden"

此时将不会重新创建该活动。您将通过该方法获得一个回调,以便在方向发生更改时可以执行某些操作。如果您不想在配置发生更改时执行任何操作,请不要覆盖活动中的
onConfigurationMethod()
。阅读了解更多信息

这是我从你那里得到的。答案中还有两种方法,但我认为我上面描述的方法是最好的

编辑:可能您还必须将
键盘|键盘隐藏
添加到
android:configChanges
属性中,如中所述


编辑#2:如果要检索可调用设备的当前方向

Activity.getResources().getConfiguration().orientation
它将返回常量
方向\纵向
方向\横向

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

int rotation =  getWindowManager().getDefaultDisplay().getRotation();
并使用类似于描述的开关盒的东西实现差异化

第三种确定设备旋转的方法是
getRequestedOrientation()
,它将返回在android:configChanges=“orientation | screenSize”中定义的常量,这意味着无论何时更改屏幕方向,都将调用Activity类中的以下方法

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

        if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { body }
    }
这就是ANDROID的本质,每当屏幕方向改变时,整个活动生命周期都会再次运行

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

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

}
试着改变

android:configChanges="orientation|keyboardHidden"
进入


这应该可以解决您的问题,但这不是一种有效的方法,要获得更好的选择,请参阅

,除非您有很好的理由这样做,否则不应尝试阻止重新创建活动。相反,您应该正确管理您的活动状态,并将任何必要的状态保存在
onSaveInstanceState()
中,然后使用
onCreate()
中提供的
捆绑包来适当地恢复状态。我们是否可以确定onCreate事件中的方向是否已更改?@Makeindia我已经更新了答案,我希望这有帮助。如果它有助于你解决问题,请随意接受它
android:configChanges="orientation|keyboardHidden"
android:configChanges="orientation|screenSize"