屏幕旋转会有什么问题?
假如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);
}