在Android开发过程中很多时候会用到屏幕旋转时需要对一些数据进行保存,例如当横竖屏区切换时要保存先前屏幕的一些数据和状态。
在清单文件中设置
android:screenOrientation="portrait" :是限制此页面数竖屏显示
android:screenOrientation="landscape"是限制此页面横屏显示
有的页面没有必要可以横竖屏切换,所以这样设置不用切换屏幕也就不会有切换屏幕时activity重新执行onCreate()等生命周期方法
代码说明
1.清单文件配置
2.Activity代码
public class OtherActivity extends AppCompatActivity {
private String save = "初始化";
private TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
textview = (TextView) findViewById(R.id.activity_other_textview);
if (savedInstanceState != null) {
save = savedInstanceState.getString("save");
}
textview.setText(save);
Log.d("TAG", "onCreate方法!!!!!!!!!!");
}
@Override
protected void onStart() {
super.onStart();
Log.d("TAG", "onStart方法!!!!!!!!!!");
}
@Override
protected void onResume() {
super.onResume();
Log.d("TAG", "onResume方法!!!!!!!!!!");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("TAG", "onRestart方法!!!!!!!!!!");
}
@Override
protected void onPause() {
super.onPause();
Log.d("TAG", "onPause方法!!!!!!!!!!");
}
@Override
protected void onStop() {
super.onStop();
Log.d("TAG", "onStop方法!!!!!!!!!!");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("TAG", "onDestroy方法!!!!!!!!!!");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (outState != null) {
outState.putString("save", "保存状态");
}
Log.d("TAG", "onSaveInstanceState方法!!!!!!!!!!");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("TAG", "onRestoreInstanceState方法!!!!!!!!!!");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("TAG", "onConfigurationChanged方法!!!!!!!!!!");
}
}
3.效果
3.1.刚刚进入
3.2.竖屏切换到横屏
3.3.横屏切换到竖屏
由此可知当不在清单文件中设置android:screenOrientation时 切换屏幕时activity生命周期方法会重复执行,即切换时相当于退出重新进入。
并且此时onConfigurationChanged方法并没有执行(竖屏——>横屏,横屏——>竖屏都没有)
代码说明
1.清单文件配置
2.Activity代码
public class OtherActivity extends AppCompatActivity {
private String save = "初始化";
private TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
textview = (TextView) findViewById(R.id.activity_other_textview);
if (savedInstanceState != null) {
save = savedInstanceState.getString("save");
}
textview.setText(save);
Log.d("TAG", "onCreate方法!!!!!!!!!!");
}
@Override
protected void onStart() {
super.onStart();
Log.d("TAG", "onStart方法!!!!!!!!!!");
}
@Override
protected void onResume() {
super.onResume();
Log.d("TAG", "onResume方法!!!!!!!!!!");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("TAG", "onRestart方法!!!!!!!!!!");
}
@Override
protected void onPause() {
super.onPause();
Log.d("TAG", "onPause方法!!!!!!!!!!");
}
@Override
protected void onStop() {
super.onStop();
Log.d("TAG", "onStop方法!!!!!!!!!!");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("TAG", "onDestroy方法!!!!!!!!!!");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (outState != null) {
outState.putString("save", "保存状态");
}
Log.d("TAG", "onSaveInstanceState方法!!!!!!!!!!");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("TAG", "onRestoreInstanceState方法!!!!!!!!!!");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d("TAG", "onConfigurationChanged方法!!!!!!!!!!");
}
}
3.效果
3.1.刚刚进入
3.2.竖屏切换到横屏
3.3.横屏切换到竖屏
由此可知当在清单文件中设置android:screenOrientation时 切换屏幕时activity生命周期方法不会会重复执行,
并且此时onConfigurationChanged方法执行(竖屏——>横屏,横屏——>竖屏都执行一次)
注意:
onConfigurationChanged方法有可能未被调用。
根据正常认知,在AndroidManifest.xml中设置Android:configChanges="orientation“,
然后在Java代码中重写onConfigurationChanged,即不会重复Activity生命周期,而是调用onConfigurationChanged。
然而今天这种做法没有效果,什么原因呢。
原来,自从Android 3.2(API 13),screen size也开始跟着设备的横竖切换而改变。
所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,
如果你想阻止程序在运行时重新加载Activity,除了设置”orientation“,你还必须设置"ScreenSize"。
解决方法:
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="sensor"
附 android:screenOrientation 取值及含义 android:screenOrientation设定该活动的方向,该值可以是任何一个下面的字符串:
1."unspecified"
默认值. 由系统选择显示方向. 在不同的设备可能会有所不同.
2."landscape"
横向
3."portrait"
纵向
4."user"
用户当前的首选方向
5."behind"
与在活动下的活动相同方向
6."sensor"
根据物理方向传感器确定方向. 取决於用户手持的方向, 当用户转动设备, 它跟随改变
7."nosensor"
不经物理方向传感器确定方向. 该传感器被忽略, 所以当用户转动设备, 显示不会跟随改变. 除了这个区别,系统选择使用相同的政策取向对於“未指定”设置. 系统根据“未指定”("unspecified")设定选择相同显示方向
3.1.准备两套不同的布局,Android会自己根据横竖屏加载不同布局: 创建两个布局文件夹:layout-land横屏,layout-port竖屏 然后把这两套布局文件放到这两文件夹里,文件名一样,文件中 控件的id也要一致,Android就会自行判断,然后加载相应布局了。
3.2.代码
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
setContentView(R.layout.横屏);
}elseif(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.竖屏);
}
需要切换横竖屏时生命周期重新执行的在onCreate方法中执行以上代码
不需要切换横竖屏时生命周期重新执行的在onConfigurationChanged方法中执行以上代码