例如一般的直播界面里面業(yè)務(wù)和SDK代碼都比較厚重,而手機直播基本都會有豎屏觀看與橫屏觀看萝风,如果不經(jīng)過特殊處理用戶在切換橫豎屏的時候就會導致Activity生命周期重走,一來回造成界面切換時有短暫閃屏紫岩,二來SDK和業(yè)務(wù)代碼有重走一次规惰,導致資源浪費和不良的用戶體驗。
還有一點涉及到連麥時泉蝌,切換橫屏重走生命周期回導致失去連麥用戶的鏈接歇万,用戶必須重新連麥才能加入進來。
如何處理以上問題呢勋陪?
有兩個出發(fā)點:
1.如何在切換橫豎屏后不重走生命周期贪磺。
2.如果不重走生命周期如何切換到對應(yīng)的橫豎屏布局
Tip:布局切換會導致界面的事件失效,并且直播控件功能失效诅愚,后面會有處理方案寒锚。
第一步
切換橫豎屏后禁止重走生命周期
在AndroidManifest.xml中的對應(yīng)Activity加入configChange屬性,并且配置android:configChanges="keyboardHidden|orientation|locale|screenSize"
如下:
<activity
android:name=".tencent.TICClassActivity2"
android:configChanges="keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
第二步
在Activity中重寫onConfigurationChanged方法,按照以上配置完清單文件后在切換橫豎屏時就不會重走生命周期了壕曼,并且會調(diào)用onConfigurationChanged方法苏研。
這樣又產(chǎn)生了一個新的問題,按照上面配置后橫豎屏切換后系統(tǒng)沒有自動幫我們切換layout-land文件夾中的布局腮郊,這個就需要我們自己手動來切換了摹蘑。
第三步
在Activity中重寫onConfigurationChanged方法中獲取橫豎屏事件
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//橫屏
} else {//豎屏
}
}
在豎屏布局中也就是res/layout對應(yīng)的activity XML中的根布局外嵌套一層FrameLayout,并且設(shè)置id.
如下:
第四步
將layout-land中對應(yīng)的橫屏布局復(fù)制到layout中,并且重命名(防止文件重復(fù))轧飞。
第五步
在橫豎屏切換事件回調(diào)中切換布局
Tip:activity_tic_class_one.xml是豎屏布局衅鹿,activity_tic_class_one_landscape.xml是橫屏布局,這兩個文件都是存在res/layout中过咬,而不是res/layout-land大渤。switchRootLayout()是處理根布局內(nèi)容替換,并且將直播控件轉(zhuǎn)移到另一個根布局上掸绞,添加懂啊另個容器之前需要先移除當前控件的父容器關(guān)聯(lián)泵三。還有一點很重要,因為切換了根布局衔掸,所有旋轉(zhuǎn)屏幕之前針對View的事件都失效了烫幕,需要重新綁定事件.
總結(jié):該思路的核心思想是先取消橫豎屏重建Activity的機制,再手動切換橫豎屏對應(yīng)的布局敞映,并且將直播View摳出來放到新的layout對應(yīng)位置中较曼,這樣就避免了重新初始化直播SDK流程了。