开发过程中难免会遇到一些需要横竖屏切换的需求,要实现这类需求一定需要明白android关于横竖屏过程中的一些问题。下面就对这类需求知识做一个整理,方便以后查阅。
1.首先是关于android:screenOrientation和 android:configChanges二个属性的详细作用表。
-
android:screenOrientation可以设置初始化横竖屏
-
android:configChanges
用来设置 activity配置改变(不仅仅是屏幕方向,还有语言、地区等等)的集合。当一个配置改变在运行中发生时,activity默认情况下会先销毁然后重新创建。但是,如果通过这个属性声明了某个配置后,将可以避免上面的情况,而是依然运行,并回调 onConfigurationChanged() 方法。该属性可以设置多个值:
上面这二个属性在横竖屏切换中很关键,下面就看一些具体的流程。
2.横竖生命周期android3.2(api级别13)以后
- 横竖屏的生命周期
manifest中的配置为 android:configChanges="orientation"或者不配置,或android:configChanges="orientation|keyboardHidden"
切换横屏生命周期重新执行一次,竖屏重新执行一次。
![](https://img.haomeiwen.com/i1930388/aa526723bfe8c77d.png)
-
manifest中的配置为 android:configChanges="orientation|keyboardHidden|screenSize"
生命周期不会重新执行,会回调onConfigurationChanged方法。
3.数据保存
- 非重启模式设置android:configChanges="orientation|keyboardHidden|screenSize"时候执行的方法其他生命周期方法不会回调
//设置
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int type = newConfig.orientation;
if (type == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
//横屏
setContentView(R.layout.activity_swcamera_streaming);
} else if (type == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
//竖屏
setContentView(R.layout.activity_swcamera_streaming);
}
Log.i("jinwei", "newConfig" + newConfig);
}
//重新setContentView这种方法可以达到横屏切换不重启,
//布局可以刷新,但是会重新设置view,其他数据不会被销毁。
- 代码强制设置横竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//横
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//竖
- 重启模式下
manifest中的配置为 android:configChanges="orientation"或者不配置,或android:configChanges="orientation|keyboardHidden"
//切换横竖屏时候onDestroy之前回调的方法,可以在这个方法中保存一些数据
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("save", "save保存的");
Log.i("jinwei", "onSaveInstanceState");
}
//重新创建activity恢复数据回调的方法,取的是onSaveInstanceState保存的值
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String s = savedInstanceState.getString("save");
Log.i("jinwei", "onRestoreInstanceState=" + s);
}
//这个方法保存的是Object推荐使用,onDestroy之前调用
@Override
public Object onRetainNonConfigurationInstance() {
Log.i("jinwei", "onRetainNonConfigurationInstance");
return "onRetainNon保存的";
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//获取onRetainNonConfigurationInstance中保存的值
String data= (String) getLastNonConfigurationInstance();
//获取onSaveInstanceState中保存的值
savedInstanceState.savedInstanceState.getString("save");
}
网友评论