7_8-核心common-互动
1 功能概述
互動應用是多個場景都可以共用的一個功能模組,包含了以下互動應用:答題、問卷、公告、抽獎、簽到。
由IPLVInteractLayout介面作為核心類別來整合。
2 使用演示
//构造
ViewStub interactLayoutViewStub = findViewById(R.id.plvlc_ppt_interact_layout);
IPLVInteractLayout interactLayout = (IPLVInteractLayout) interactLayoutViewStub.inflate();
//初始化
interactLayout.init();
//显示公告
interactLayout.showBulletin();
//销毁
interactLayout.destroy();
具體的使用方法請參考PLVLCCloudClassActivity中對IPLVInteractLayout介面的呼叫。
3 介面介紹
IPLVInteractLayout作為互動應用的介面,定義了以下幾個需要在Activity中使用的方法:
/**
* date: 2020/10/9
* author: HWilliamgo
* 针对互动应用封装的Interface,可以在各个场景使用,定义了:
* 1. 外部直接调用的方法
*/
public interface IPLVInteractLayout {
// <editor-fold defaultstate="collapsed" desc="1. 外部直接调用的方法">
/**
* 初始化
*/
void init();
/**
* 显示公告
*/
void showBulletin();
/**
* 销毁
*/
void destroy();
/**
* 点击返回
*
* @return 返回true表示拦截事件
*/
boolean onBackPress();
// </editor-fold>
}
4 實作介紹
PLVInteractLayout是IPLVInteractLayout介面的實作類別,它內部實作了互動應用的邏輯:
4.1 初始化
@Override
public void init() {
if (interactWebView == null) {
return;
}
//加载互动应用资源
if (LOAD_WEB_URL) {
interactWebView.loadWeb();
} else {
interactWebView.loadUrl("file:///android_asset/index.html");
}
//设置要显示的互动应用
setupInteractApp();
}
載入資源
初始化時,根據目前需求選擇載入線上互動應用資源或載入本地互動應用資源,即根據變數
LOAD_WEB_URL。預設為true表示載入線上資源,如果需要載入本地資源,則將這裡的LOAD_WEB_URL改為false即可。設定互動應用
呼叫
setupInteractApp()方法設定具體的互動應用,將所需的互動應用加入進來。
4.2 設定互動應用
設定互動應用即將想要的互動應用加入進來。請見方法:setupInteractApp()
//通用控制
PLVInteractCommonControl commonControl = new PLVInteractCommonControl();
//互动答题
PLVInteractAnswer interactAnswer = new PLVInteractAnswer();
//互动问卷调查
LVInteractQuestionnaire interactQuestionnaire = new PLVInteractQuestionnaire();
//互动抽奖
interactLottery = new PLVInteractLottery(commonControl);
//互动签到
PLVInteractSignIn interactSignIn = new PLVInteractSignIn();
//互动公告
interactBulletin = new PLVInteractBulletin();
interactWebView.addInteractApp(commonControl);
interactWebView.addInteractApp(interactAnswer);
interactWebView.addInteractApp(interactQuestionnaire);
interactWebView.addInteractApp(interactLottery);
interactWebView.addInteractApp(interactSignIn);
interactWebView.addInteractApp(interactBulletin);
setupInteractApp()方法的邏輯分為兩步:
實例化具體的互動應用,並設定對應的回呼。注意,通用控制不屬於業務上的互動應用,它是用於控制所有互動應用的一個通用類別,是必須要加入的。
將所有互動應用加入互動應用webView中。
4.3 互動應用的實作
4.3.1 互動應用類別簡介
互動應用的具體實作在interact/app目錄下,共有5個互動應用,每個類別分別表示:
- PLVInteractAnswer:答題
- PLVInteractBulletin:公告
- PLVInteractLottery:抽獎
- PLVInteractQuestionnaire:問卷
- PLVInteractSignIn:簽到
該目錄的其他類別:
- PLVInteractCommonControl:通用控制類別,用於每個互動應用共用的邏輯封裝在此類別中
- IPLVInteractSendServerResultToJs:互動應用發送到server的結果再發送到JS的監聽器
4.3.2 具體互動應用實作邏輯與如何自訂UI
實作邏輯
我們找一個較為簡單的互動應用來看實作邏輯,例如:互動簽到。
PLVInteractSignIn類別的實作中關鍵分為兩個方法。processSocketMsg(String msg, String event)用於處理socket訊息根據event判斷時間類型,過濾出簽到訊息,並處理msg變數的資料,再呼叫
sendMsgToJs方法,將對應事件和資料發送到webView,由webView做出對應的UI回應。registerMsgReceiverFromJs(IPLVInteractJSBridge interactJSBridge)用於處理JS訊息使用
IPLVInteractJSBridge介面的方法註冊JS事件監聽器,在收到JS發送來的簽到事件時(也就是使用者點擊了webView上的簽到),對資料進行處理,並將結果發送到server。sendResultToServer(PolyvSignIn2SocketVO socketVO)用於發送結果到server。呼叫對應的方法將結果發送到伺服器端。
自訂UI
自訂UI的方式分為兩種,我們還是以簽到為例:
- 重寫
PLVInteractSignIn方法:- 重寫
processSocketMsg方法中的邏輯,提取出伺服器端發送來的資料後,不再呼叫sendMsgToJs()將事件發送到webView,將資料渲染到你自訂的介面UI上即可。 - 將
registerMsgReceiverFromJs的方法體清空。因為不再需要用webView渲染介面了,因此也不再監聽webView發送來的事件了。 - 發送資料到server:當你的介面UI回應了對應的事件後,直接呼叫
sendResultToServer,並發送資料到server。
- 重寫
- 繼承
PLVInteractAppAbs類別,實作自己的邏輯,並自己在PLVInteractLayout中加入webView。
- 重寫
4.4 SDK核心類別介紹
4.1.1 PLVInteractWebView
互動應用WebView,負責渲染互動應用的UI,以及處理維護多個互動應用。
介面如下:
/**
* 加载webView页面
*/
public void loadWeb() ;
/**
* 添加互动应用
*
* @param interactAppAbs 互动应用
*/
public void addInteractApp(PLVInteractAppAbs interactAppAbs);
/**
* 移除互动应用
*
* @param interactAppAbs 互动应用
*/
public void removeInteractApp(PLVInteractAppAbs interactAppAbs);
/**
* 销毁
*/
public void destroy();
4.1.2 PLVInteractAppAbs
PLVInteractAppAbs是互動應用基礎類別,所有的互動應用以此類別作為父類別擴展,來實作各自的業務邏輯。
抽象方法:
需要具體的子類別互動應用重寫的方法。
/**
* 处理socket消息
*
* @param msg 消息
* @param event 事件
*/
protected abstract void processSocketMsg(String msg, String event);
/**
* 注册JS发到原生的消息接收器
*/
protected abstract void registerMsgReceiverFromJs(IPLVInteractJSBridge interactJSBridge);
封裝子類別共用API:
/**
* 设置显示隐藏监听器
*
* @param onInteractAppShowListener listener
*/
public void setOnShowListener(OnInteractAppShowListener onInteractAppShowListener);
子類別使用的方法:
/**
* 通知UI显示
*/
protected void notifyShow();
/**
* 发送消息到JS
*
* @param handlerName 事件名字
* @param data 数据
* @param callBack 回调
*/
protected void sendMsgToJs(String handlerName, String data, CallBackFunction callBack);
