1

我相信在 Android 的方向处理中偶然发现了一个固有的故障。

我有一个活动 A

setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

没有传感器意味着 Activity A 不会受到物理设备旋转的影响。

我还有一个活动 B,它有一个被覆盖的 onSaveInstanceBundle

/*Will be called before orientation change*/
@Override
protected void onSaveInstanceState(Bundle currentState) {
      super.onSaveInstanceState(currentState);
      currentState.putBoolean(ApplicationConstants.Messages.ORIENTATION_CHANGED , true);
      currentState.putBoolean("RESTART", true);

      currentState.putString(ApplicationConstants.Messages.CURRENT_LANGUAGE,currentLocale);

    }

onSaveInstance 总是在屏幕方向改变时被调用。和A一样,B在onCreate()下也有如下

setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

现在难题来了。

我从 A 按下一个按钮,该按钮被编程为在我将设备保持在正常纵向模式时调用 B。我有一个断点附加到 onSaveInstance

正如预期的那样,调用 B 时不会调用 onSaveInstance

然而,这是一个奇怪的事实。如果我将设备保持在横向模式,然后调用 B,则调用 B 的 onSaveInstance,由于程序在断点处暂停,我们可以看到设备屏幕已横向。

因此,即使我对活动没有 SENSOR 参数,传感器实际上仍在工作。并且在活动切换之间,如果在我们以横向方式持有设备时完成,则目标活动以横向方式开始。在我放开断点后,B 恢复为纵向视图。

关于为什么这会影响我正在开发的项目,我有一个很长的故事。我想知道是否有人对这种情况有任何见解。

总结一下,我的问题是:

是不是真的在Activity切换时,Android系统会忽略指定的方向,默认使用设备的物理位置?我无法在 androidManifest 中设置方向。我注意到如果我们将定向模式放在清单中,情况并非如此。

4

2 回答 2

4

在活动切换期间,android系统是否会忽略指定的方向,并且默认使用设备的物理位置?.

这并不完全正确,因为您没有指定方向。SCREEN_ORIENTATION_NOSENSOR只是意味着“从现在开始忽略传感器并将其保持在当前方向”。在运行之前不会调用onCreate()它。你没有在说“从一开始就锁定肖像”。

我无法在 androidmanifest 中设置方向。我注意到如果我们将定向模式放在清单中,情况并非如此。

出于好奇,你为什么不能?这是最常见的方法:

android:screenOrientation="portrait"
android:configChanges="orientation|screenSize"

它使用清单条目正确锁定的原因是 ActivityManager 知道它应该在 Activity 运行之前被锁定。

于 2013-09-19T20:01:02.027 回答
1

编辑:将以下内容留作参考,但这显然不起作用。:(


他希望应用程序在手机上锁定为纵向,并在平板电脑上自由旋转。

啊。好吧,您实际上可以通过清单来完成此操作。你如何做到这一点取决于你想要定义为“平板电脑”的内容。让我们假设截止点是 Google 建议sw600dp的(600dp 的最小宽度对于 7 英寸平板电脑来说是一个很好的断点)。

您可以在文件res夹中创建以下文件结构:

res
    - values
        - styles.xml
    - values-sw600dp
        - styles.xml

在您的values/styles.xml(这将是您的非平板电脑样式)中,为您定义以下样式Activity

<!-- This will be a base style that will affect both tablet and non-tablet -->
<style name="BaseTheme" parent="{{pick a base theme here -- e.g. Theme.Light}}"/>

<!-- This is the local style that will be used on devices whose smallest width
     is less than 600dp -->
<style name="BaseTheme.Activity">
    <item name="android:screenOrientation">portrait</item>
</style>

在你的values-sw600dp/styles.xml

<!-- This is the local style that will be used on devices whose smallest
     width is greater than or equal to 600dp. We define nothing here other
     than the fact that the style exists, so it will have the default screen
     orientation - that is, it will rotate freely. -->
<style name="BaseTheme.Activity"/>

现在,在您的AndroidManifest.xml, 在您的activity标签内,添加:

android:theme="@style/BaseTheme.Activity"

你应该得到想要的结果。但是,您应该首先删除您添加的所有 Java 代码以尝试自己管理它,因为它可能会与此冲突导致意外结果。

于 2013-09-19T20:16:16.260 回答