Android 安卓,当我旋转设备时,如何不破坏活动?

Android 安卓,当我旋转设备时,如何不破坏活动?,android,android-activity,orientation,Android,Android Activity,Orientation,我有一个只在纵向模式下工作的应用程序,我在清单文件中对每个活动进行了更改,方向为纵向。但当我旋转设备时,活动会再次创建。 如何不破坏活动?对于API 12及以下版本:添加 android:configChanges="orientation" 如果您的目标是API 13或更高版本,请添加“屏幕大小”,因为每当您的方向改变时,屏幕大小也会改变,否则新设备将继续破坏您的活动。有关使用“屏幕大小”的更多信息,请参见下面Egg的答案 到AndroidManifest.xml中的活动。这样,您的活动不会

我有一个只在纵向模式下工作的应用程序,我在清单文件中对每个活动进行了更改,方向为纵向。但当我旋转设备时,活动会再次创建。
如何不破坏活动?

对于API 12及以下版本:添加

android:configChanges="orientation"
如果您的目标是API 13或更高版本,请添加“屏幕大小”,因为每当您的方向改变时,屏幕大小也会改变,否则新设备将继续破坏您的活动。有关使用“屏幕大小”的更多信息,请参见下面Egg的答案


到AndroidManifest.xml中的活动。这样,您的活动不会自动重新启动。有关更多信息,请参见查看浮动图像中的此代码。这是有史以来处理屏幕旋转最有趣的方法

根据官方文件flurin说

注意:如果您的应用程序目标API级别13或更高(如声明的 根据minSdkVersion和targetSdkVersion属性),则应该 还要声明“屏幕大小”配置,因为它也会更改 当设备在纵向和横向之间切换时

因此,如果您的应用程序目标API级别为13或更高,则应改为设置此配置:

android:configChanges=“orientation | screenSize”
正确的解决方案是

android:configChanges="orientation|screenSize"
Android文档:

当前可用的屏幕大小已更改。这表示当前可用大小相对于当前纵横比的变化,因此当用户在横向和纵向之间切换时将发生变化。但是,如果您的应用程序的目标API级别为12或更低,则您的活动始终会自行处理此配置更改(此配置更改不会重新启动您的活动,即使在Android 3.2或更高版本的设备上运行时也是如此)*

填写舱单:

android:configChanges="orientation|screenSize|keyboardHidden"
并在解决问题的活动中覆盖此项:

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

我把这个弄得一团糟,然后重新认识到在清单文件中,我将配置更改放在应用程序级别,而不是活动级别。下面是代码正确运行时的样子

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

既然Android支持分屏(“Android术语中的多窗口”),您可能还需要添加屏幕大小|最小屏幕大小|屏幕布局|方向。所以,要处理旋转和分割屏幕,您需要在android中实现类似的功能:configChanges

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>


通常建议不要这样做,您可以尝试通过以下方式以编程方式设置应用程序方向:setRequestedOrientation(ActivityInfo.SCREEN\u orientation\u Grait);为什么会反对呢?假设我们有一个运行时间为2秒的服务。如果活动每次都销毁,则该服务每次都会继续运行,而我只需要它运行一次。活动将再次重新启动。我不知道在活动旋转时做所有必须做的事情有什么意义,即使它不是虚拟旋转。有没有一种方法可以禁用传感器发送给操作系统的关于旋转的消息,或者类似的消息,从根本上解决这个问题?您在哪个设备上编程?请记住,例如,滑出键盘也可以重新启动您的活动。。。(如果这是设置confChanges为“keyboard | keyboardHidden | orientation”的原因),则禁用布局更改。如何修复?此解决方案解决了销毁和创建活动,但如何处理布局更改。我的意思是说当改变方向时,加载相应的布局。有没有一种方法可以通过编程来设置android:configChanges参数,而不是在清单文件中?非常感谢!所有其他答案都忽略了这一部分,API级别13引入了这个屏幕大小的东西。你刚刚救了我的命!:)@鸡蛋谢谢你!:)这有帮助!很好的提示当你兼职的时候很难跟上文档的进度。感谢您为我们分享此解决方案。你救了我一天。谢谢;)为什么要重写onConfigurationChanged方法并调用原始实现做任何有用的事情?您应该在帖子中共享代码,而不是图像。请在帖子中以文本而不是屏幕截图的形式显示实际清单代码。其他人无法从您的图像复制和粘贴。详情请参阅。非常感谢。
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>