Activity之横竖屏切换生命周期(废弃)

在Android开发过程中很多时候会用到屏幕旋转时需要对一些数据进行保存,例如当横竖屏区切换时要保存先前屏幕的一些数据和状态。

 

1.页面没有必要设置横竖屏切换时

 

在清单文件中设置



android:screenOrientation="portrait" :是限制此页面数竖屏显示 


android:screenOrientation="landscape"是限制此页面横屏显示

有的页面没有必要可以横竖屏切换,所以这样设置不用切换屏幕也就不会有切换屏幕时activity重新执行onCreate()等生命周期方法

 

 

 

2.页面要进行横竖屏切换

 

2.1.不设置 android:screenOrientation属性

 

代码说明

 

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.竖屏切换到横屏

Activity之横竖屏切换生命周期(废弃)_第1张图片

 

 

3.3.横屏切换到竖屏

Activity之横竖屏切换生命周期(废弃)_第2张图片

 

由此可知当不在清单文件中设置android:screenOrientation时 切换屏幕时activity生命周期方法会重复执行,即切换时相当于退出重新进入。

并且此时onConfigurationChanged方法并没有执行(竖屏——>横屏,横屏——>竖屏都没有)

 

 

 

2.2.配置android:screenOrientation

 

代码说明

 

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.横竖屏时想加载不同的布局

 

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方法中执行以上代码

你可能感兴趣的:(综合)