一、竖屏与横屏
1、手机有竖屏与横屏两种模式,两种屏幕方向不但造成App界面的展示差异,而且竖屏和横屏切换之际,甚至会打乱App的生命周期
2、日志
竖屏:
bash
2026-04-09 13:37:59.756 9363-9363 sam com.example.chapter09 D onCreate
2026-04-09 13:37:59.960 9363-9363 sam com.example.chapter09 D onStart
2026-04-09 13:38:00.092 9363-9363 sam com.example.chapter09 D onResume
切换到横屏:
bash
2026-04-09 13:38:10.225 9363-9363 sam com.example.chapter09 D onPause
2026-04-09 13:38:10.228 9363-9363 sam com.example.chapter09 D onStop
2026-04-09 13:38:10.234 9363-9363 sam com.example.chapter09 D onDestroy
2026-04-09 13:38:10.582 9363-9363 sam com.example.chapter09 D onCreate
2026-04-09 13:38:10.594 9363-9363 sam com.example.chapter09 D onStart
2026-04-09 13:38:10.597 9363-9363 sam com.example.chapter09 D onResume
原来的activity是销毁了,切换到横屏后又创建了一个activity
二、系统配置变更的处理机制
1、为了用同一个activity去切换,避免横竖屏切换时重新加载界面的情况,android设计了一种配置变更机制,在指定的环境配置发生变更之时,无需重启活动页面,只需执行特定的变更行为
2、实现步骤
(1)修改AndroidManifest.xml,给activity节点增加android:configChanges属性
(2)修改活动页面的Java代码,重写活动页面onConfigurationChanged方法,补充对应的代码处理逻辑
3、配置变更的豁免情况
|--------------------|-------------------------|
| configChanges属性的取值 | 说明 |
| orientation | 屏幕方向发生改变 |
| screenLayout | 屏幕的显示发生改变,例如在全屏和分屏之间切换 |
| screenSize | 屏幕大小发生改变,例如在竖屏与横屏之间切换 |
| keyboard | 键盘发生改变,例如使用了外部键盘 |
| keyboardHidden | 软键盘弹出或隐藏 |
| navigation | 导航方式发生改变,例如采用了轨迹球导航 |
| fontScale | 字体比例发生改变,例如在系统设置中调整默认字体 |
| locale | 设备的本地位置发生改变,例如切换了系统语言 |
| uiMode | 用户界面的模式发生改变,例如开启了夜间模式 |
4、例子
ChangeDirectionActivity.java
java
package com.example.chapter09;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.TextView;
public class ChangeDirectionActivity extends AppCompatActivity {
private TextView tv_monitor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_direction);
tv_monitor = findViewById(R.id.tv_monitor);
}
// 在配置项变更时触发,比如屏幕方向发生变更等
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
switch (newConfig.orientation) {
case Configuration.ORIENTATION_PORTRAIT:
tv_monitor.setText("当前屏幕为竖屏方向");
break;
case Configuration.ORIENTATION_LANDSCAPE:
tv_monitor.setText("当前屏幕为横屏方向");
break;
default:
break;
}
}
}
布局文件,activity_change_direction.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ChangeDirectionActivity">
<TextView
android:id="@+id/tv_monitor"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请旋转手机使屏幕在竖屏和横屏之间切换"
android:textColor="@color/black"
android:textSize="17sp"/>
</LinearLayout>
AndroidManifest.xml清单文件修改
XML
<activity
android:name=".ChangeDirectionActivity"
android:exported="true"
android:configChanges="orientation|screenLayout|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
5、限定屏幕方向
android:screenOrientation="portrait"