Android 中奇怪的屏幕旋转行为

Strange screen rotation behaviour in Android

我的应用程序中有两个活动。

主要 activity 在设备处于纵向位置时显示,当设备转向横向时 'summary screen' Activity (ShowAndTellActivity)开始了。

应用程序的这一部分似乎可以可靠地工作,并通过以下方式实现:

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

    int orientation=newConfig.orientation;

    switch(orientation) {

        case Configuration.ORIENTATION_LANDSCAPE:

            show_and_tell_intent.setClass(getApplicationContext(),ShowAndTellActivity.class);
            show_and_tell_intent.putExtra("each_pays", v_currency_symbol.concat(new DecimalFormat("0.00").format(v_each_to_pay)));
            startActivity(show_and_tell_intent);

            break;

        case Configuration.ORIENTATION_PORTRAIT:

            break;

    }
}

摘要 activity 包含以下代码 finish() 当设备旋转回纵向位置时 Activity:

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

    int orientation=newConfig.orientation;

    switch(orientation) {

        case Configuration.ORIENTATION_LANDSCAPE:

            break;

        case Configuration.ORIENTATION_PORTRAIT:

            finish();
            break;

        case Configuration.ORIENTATION_UNDEFINED:

            finish();
            break;

    }
}

然而,当设备第一次旋转回纵向时,摘要 activity 没有完成 - 而是以纵向显示摘要屏幕(看起来很糟糕)。

将设备旋转回横向(摘要屏幕再次看起来正常)并再次旋转回纵向会导致摘要 activity 按预期完成。

从这一点来看,旋转设备似乎可以可靠地工作,应用程序可以在活动之间正确切换。换句话说,只有第一次旋转回纵向似乎不会触发摘要 activity.

finish()

这几乎就像摘要屏幕 Activity 启动时一样,直到它改变一次才知道它的方向。

我遇到了类似的问题。在我的例子中,onConfigurationChanged 不是第一次被调用。对我来说 onRestoreInstanceState() 有效

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) 
{
    super.onRestoreInstanceState(savedInstanceState);
    if (savedInstanceState != null) 
    {
        switch(getResources().getConfiguration().orientation) {
            case Configuration.ORIENTATION_LANDSCAPE:
                break;

            case Configuration.ORIENTATION_PORTRAIT:
                finish();
                break;

            case Configuration.ORIENTATION_UNDEFINED:
                finish();
                break;
        }

    }
}

我能找到实现此目的的唯一可靠方法是编写我自己的旋转检测处理程序:

    myOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL){

        @Override
        public void onOrientationChanged(int deviceAngle){
            if (deviceAngle >= 320 || deviceAngle <= 40) {
                finish();
            }
        }
    };

在第二个 activity 中使用内置的 onConfigurationChanged 是不可靠的 - 它总是在第一次从横向到纵向旋转时失败。