Android 解决类似直播界面横竖屏切换导致界面销毁重建的一种
例如一般的直播界面里面业务和SDK代码都比较厚重,而手机直播基本都会有竖屏观看与横屏观看,如果不经过特殊处理用户在切换横竖屏的时候就会导致Activity生命周期重走,一来回造成界面切换时有短暂闪屏,二来SDK和业务代码有重走一次,导致资源浪费和不良的用户体验。
还有一点涉及到连麦时,切换横屏重走生命周期回导致失去连麦用户的链接,用户必须重新连麦才能加入进来。
如何处理以上问题呢?
有两个出发点:
1.如何在切换横竖屏后不重走生命周期。
2.如果不重走生命周期如何切换到对应的横竖屏布局
Tip:布局切换会导致界面的事件失效,并且直播控件功能失效,后面会有处理方案。
第一步
切换横竖屏后禁止重走生命周期
在AndroidManifest.xml中的对应Activity加入configChange属性,并且配置android:configChanges="keyboardHidden|orientation|locale|screenSize"
如下:
<activity
android:name=".tencent.TICClassActivity2"
android:configChanges="keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
第二步
在Activity中重写onConfigurationChanged方法,按照以上配置完清单文件后在切换横竖屏时就不会重走生命周期了,并且会调用onConfigurationChanged方法。
这样又产生了一个新的问题,按照上面配置后横竖屏切换后系统没有自动帮我们切换layout-land文件夹中的布局,这个就需要我们自己手动来切换了。
第三步
在Activity中重写onConfigurationChanged方法中获取横竖屏事件
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//横屏
} else {//竖屏
}
}
在竖屏布局中也就是res/layout对应的activity XML中的根布局外嵌套一层FrameLayout,并且设置id.
如下:
image.png
第四步
将layout-land中对应的横屏布局复制到layout中,并且重命名(防止文件重复)。
image.png
第五步
在横竖屏切换事件回调中切换布局
image.png
Tip:activity_tic_class_one.xml是竖屏布局,activity_tic_class_one_landscape.xml是横屏布局,这两个文件都是存在res/layout中,而不是res/layout-land。switchRootLayout()是处理根布局内容替换,并且将直播控件转移到另一个根布局上,添加懂啊另个容器之前需要先移除当前控件的父容器关联。还有一点很重要,因为切换了根布局,所有旋转屏幕之前针对View的事件都失效了,需要重新绑定事件.
总结:该思路的核心思想是先取消横竖屏重建Activity的机制,再手动切换横竖屏对应的布局,并且将直播View抠出来放到新的layout对应位置中,这样就避免了重新初始化直播SDK流程了。