Android屏幕横竖切换和生命周期变化

2,562 阅读1分钟

一、屏幕横竖屏切换的代码

竖屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

横屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

获得当前屏幕状态

getResources().getConfiguration().orientation

此状态可为:Configuration.ORIENTATION_PORTRAITConfiguration.ORIENTATION_LANDSCAPE


二、横竖屏切换Activity生命周期回调

横竖屏属性可以在AndroidManifest.xml中设置,也可以在MainActivity.java中进行设置(上面已经提及)。

本节主要讲解在AndroidManifest.xml中的设置

<activity android:name=".MainActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:screenOrientation="portrait">
</activity>


(一)configChanges属性

设置configChanges这个值可以避免Activity生命周期被回到。该部分具体的参数:

  • orientation:屏幕在纵向和横向间旋转
  • keyboardHidden:键盘显示或隐藏
  • screenSize:屏幕大小改变
  • fontScale:用户变更了首选字母大小
  • locale:用户选择了不同的语言设定
  • keyboard:键盘类型变更,如手机从九宫格键盘变为全键盘
  • touchscreen或navigation:键盘或导航方向变换,一般不会发生这种情况。


前面三个是常用的,后面属性很少使用

如果要activity中的生命周期不回调,就要设置:

android:configChanges="orientation|keyboardHidden|screenSize"

缺少其中任一一个都会Activity生命周期回调,即如下情况:


不发生回调是如下情况:



在这附上对应的代码:

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate");

        Button bt = (Button)findViewById(R.id.bt_skip_other_activity);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                else
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
        });
    }

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i(TAG, "onConfigurationChanged");
        initChange();
    }

    private void initChange(){
        if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
            Log.i(TAG, "屏幕改变,当前为竖屏");
        else
            Log.i(TAG, "屏幕改变,当前为横屏");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "onRestart");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "onResume");
    }

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG, "onSaveInstanceState");
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG, "onRestoreInstanceState");
    }
}