【问题标题】:Android App orientation change restarts activityAndroid 应用程序方向更改重新启动活动
【发布时间】:2016-07-14 08:13:52
【问题描述】:

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

<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>

在上面的代码中,sn-p android:configChanges="orientation|keyboardHidden" 应该为我完成工作,但活动仍在重新启动。请告诉我如何纠正它。

【问题讨论】:

  • 除非您有充分的理由,否则您不应尝试阻止重新创建活动。相反,您应该正确管理您的活动状态并将任何必要的状态保存在onSaveInstanceState() 中,然后使用onCreate() 中提供的Bundle 适当地恢复状态。

标签: android


【解决方案1】:

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

android:configChanges="orientation|keyboardHidden"

android:configChanges="orientation|screenSize"

届时将不会重新创建活动。您将通过onConfigurationChanged() 方法获得回调,以便您可以在方向改变时执行某些操作。如果您不想在配置更改后执行任何操作,请不要覆盖 Activity 中的 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 描述的 switch case 实现差异化。

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

【讨论】:

  • 我们能否以某种方式确定 onCreate 事件中的方向是否已更改?
  • @MakeInIndia 我已经更新了我的答案,希望对您有所帮助。如果它帮助您解决问题,请随时接受它
【解决方案2】:

android:configChanges="orientation|screenSize" 表示每当屏幕方向改变时,Activity 类中的以下方法都会被调用。

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

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

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

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

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

}

【讨论】:

    【解决方案3】:

    尝试改变

    android:configChanges="orientation|keyboardHidden"
    

    进入

    android:configChanges="orientation|screenSize"
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多