技术方案Android

Android 解决类似直播界面横竖屏切换导致界面销毁重建的一种

2020-06-15  本文已影响0人  lucasDev

例如一般的直播界面里面业务和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流程了。

上一篇下一篇

猜你喜欢

热点阅读