android 屏幕旋转问题

屏幕旋转会有什么问题?

假如activity没有配置什么属性,则当前界面会被销毁重新创建,走onPause()-onStop()-onDestory()-onCreate()-onStart()-onResume(), 会重新初始化全局变量,比如说。我们用一个clickCount 变量统计按钮点击次数,在竖屏的时候点击了3次,在横屏的时候,这个变量会被赋予初始值。可以理解为再次进入当前界面,变量的值都要从新获取,假如说视频播放,之前是竖屏播放,切换到横屏,这个时候该怎么办?为了播放体验,肯定不能再次拉取数据并加载,最后播放.

 

解决办法(一)

android:configChanges="orientation|keyboardHidden|screenSize"

在mainfest中添加这个配置就可以了。就不会重新创建并播放了。

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged: " + newConfig.orientation);
        todo 你自己的逻辑
    }

注意:如果没有在xml中添加 configChange配置,当我们改变屏幕方向时,这个方法不会被调用,因为系统会重建acitivity,这点需要注意。

二 

模拟一下切换屏幕的生命周期方法调用,看看打印

2019-03-05 14:38:57.982 26405-26405/com.sjh.screenconfig D/MainActivity.log: onPause: 
2019-03-05 14:38:57.983 26405-26405/com.sjh.screenconfig D/MainActivity.log: onSaveInstanceState: 2 temp123
2019-03-05 14:38:57.985 26405-26405/com.sjh.screenconfig D/MainActivity.log: onDestroy: 
2019-03-05 14:38:58.074 26405-26405/com.sjh.screenconfig D/MainActivity.log: onCreate: 
2019-03-05 14:38:58.075 26405-26405/com.sjh.screenconfig D/MainActivity.log: onStart: 
2019-03-05 14:38:58.078 26405-26405/com.sjh.screenconfig D/MainActivity.log: onRestoreInstanceState: 4 temp123 temp10
2019-03-05 14:38:58.081 26405-26405/com.sjh.screenconfig D/MainActivity.log: onResume: 

在这里我们加入了

 @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("temp1", 4);
        Log.d(TAG, "onSaveInstanceState: " + temp1 + " temp" + temp);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onRestoreInstanceState: " + savedInstanceState.get("temp1") + " temp" + temp + " temp1" + temp1);
    }

想要用onSaveInstanceState去存储变量值,并在onRestoreInstanceState中取出来。对比前面的打印,可以知道这两个方法什么时候被调用。但这种方法对恢复大量数据逻辑显然不友好,并不适用。

三 全屏播放相关方法

	public static void setFullScreen(Activity activity) {
		activity.getWindow().setFlags(
				WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
	}

	public static void quitFullScreen(Activity activity) {
		final WindowManager.LayoutParams attrs = activity.getWindow()
				.getAttributes();
		attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
		activity.getWindow().setAttributes(attrs);
		activity.getWindow().clearFlags(
				WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
	}

 

你可能感兴趣的:(android,view)