为什么`android:screenOrientation ="后面"`在android 4.1.2中没有效果?

moo*_*rka 20 android orientation screen-orientation android-orientation android-activity

作为测试样本,应用程序有2个活动:MainActivity在按钮单击时启动SecondActivity.它在Android 4.0.4上工作正常,但在Android 4.1.2上我遇到了意外行为.

系统设置中的AutoRotation已关闭(或打开 - 无关紧要,无论如何都会忽略"后面"选项). android:screenOrientation="landscape"为MainActivity设置,并android:screenOrientation="behind"为SecondActivity设置,这意味着必须以横向方向启动SecondActivity.适用于Android 4.0.4,但在Android 4.1.2上,SecondActivity以纵向方向开始.

AndroidManifest.xml中:

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="16" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.my.example.testbehindorientation.MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="landscape" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.my.example.testbehindorientation.SecondActivity"
        android:configChanges="screenSize|orientation"
        android:label="@string/title_activity_second"
        android:screenOrientation="behind" >
    </activity>
</application>
Run Code Online (Sandbox Code Playgroud)

SecondActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    logOrientation("onCreate");
}


@Override
protected void onDestroy() {
    super.onDestroy();
    logOrientation("onDestroy");
}

@Override
protected void onResume() {
    super.onResume();
    logOrientation("onResume");
}

private void logOrientation(String prefix) {
        int requestedOrientation = this.getRequestedOrientation();
        WindowManager lWindowManager =  (WindowManager) getSystemService(WINDOW_SERVICE);
        Configuration cfg = getResources().getConfiguration();
        int lRotation = lWindowManager.getDefaultDisplay().getRotation();   
        int orientation = cfg.orientation;
        Log.i(LOG_TAG, prefix + ", requestedOrientation is " + requestedOrientation + ", rotation is " + lRotation + ", orientation is " + orientation);
}
Run Code Online (Sandbox Code Playgroud)

android:configChanges="screenSize|orientation"在MainActivity中单击按钮后,在AndroidManifest.xml中为SecondActivity 记录不带行的输出:

onCreate, requestedOrientation is 3, rotation is 1, orientation is 2
onResume, requestedOrientation is 3, rotation is 1, orientation is 2
onDestroy, requestedOrientation is 3, rotation is 0, orientation is 1
onCreate, requestedOrientation is 3, rotation is 0, orientation is 1
onResume, requestedOrientation is 3, rotation is 0, orientation is 1
Run Code Online (Sandbox Code Playgroud)

使用android:configChanges="screenSize|orientation"AndroidManifest.xml中包含的行记录:

onCreate, requestedOrientation is 3, rotation is 1, orientation is 2
onResume, requestedOrientation is 3, rotation is 1, orientation is 2
Run Code Online (Sandbox Code Playgroud)

现在没有活动娱乐,但结果总是一样的 - SecondActivity从纵向开始!:(也就是说,由于某种原因,SecondActivity在onResume之后旋转为肖像.为什么?..

测试:

  • 三星Galaxy S3搭配Android 4.0.4(好的)
  • 三星Galaxy S3搭载Android 4.1.(错误)
  • Android 4.1.2仿真器,具有纵向主屏幕方向(Bug)
  • Android 4.0.3模拟器(好的)
  • Android 4.2模拟器(Bug)

V.P*_*.P. 0

android:targetSdkVersion="16"

在清单文件中删除此语句,因为 SDKVersion=16 仅适用于 v4.0。