# 6\_1-互动学堂场景（Activity）

* [1 功能概述](#1-功能概述)
* [2 接口介绍](#2-接口介绍)
* [3 实现介绍](#3-实现介绍)
  * [3.1 初始化页面参数](#31-初始化页面参数)
  * [3.2 初始化直播间数据管理器](#32-初始化直播间数据管理器)
  * [3.3 初始化页面UI](#33-初始化页面ui)
  * [3.4 设置布局回调](#34-设置布局回调)

#### 1 功能概述

互动学堂场景的界面实现为 **PLVHCLiveHiClassActivity**

互动学堂场景下定义的 讲师、学生 的 共用界面。 支持的功能有：连麦、聊天室、文档、课堂管理

#### 2 接口介绍

```java
/**
  * 启动互动学堂上课页
  *
  * @param activity      上下文Activity
  * @param channelId     频道号
  * @param courseCode    课程号，课程登录时需要传
  * @param lessonId      课节Id
  * @param token         token
  * @param sessionId     场次Id
  * @param userType      用户类型
  * @param viewerId      上课者Id
  * @param viewerName    上课者昵称
  * @param avatarUrl     上课者头像url
  * @return PLVLaunchResult.isSuccess=true表示启动成功，PLVLaunchResult.isSuccess=false表示启动失败
  */
@SuppressWarnings("ConstantConditions")
@NonNull
public static PLVLaunchResult launchHiClass(@NonNull Activity activity,
                                            @NonNull String channelId,
                                            String courseCode,
                                            long lessonId,
                                            @NonNull String token,
                                            @NonNull String sessionId,
                                            @NonNull String userType,
                                            @NonNull String viewerId,
                                            @NonNull String viewerName,
                                            @NonNull String avatarUrl,
                                            boolean isShowDeviceDetectionLayout);
```

#### 3 实现介绍

互动学堂将每个功能模块封装成一个布局Layout类，根据展示需要的不同在Fragment中对布局进行组合，在Activity中通过简单地添加Fragment即可完成集成。

**3.1 初始化页面参数**

```java
private void initParams() {
    // 获取输入数据
    Intent intent = getIntent();
    String channelId = intent.getStringExtra(EXTRA_CHANNEL_ID);
    String viewerId = intent.getStringExtra(EXTRA_VIEWER_ID);
    String viewerName = intent.getStringExtra(EXTRA_VIEWER_NAME);
    String avatar = intent.getStringExtra(EXTRA_AVATAR_URL);
    String userType = intent.getStringExtra(EXTRA_USER_TYPE);

    String token = intent.getStringExtra(EXTRA_TOKEN);
    long lessonId = intent.getLongExtra(EXTRA_LESSON_ID, 0);
    String courseCode = intent.getStringExtra(EXTRA_COURSE_CODE);

    // 设置Config数据
    PLVLiveChannelConfigFiller.setupUser(viewerId, viewerName, avatar, userType);
    PLVLiveChannelConfigFiller.setupChannelId(channelId);
    PLVLiveChannelConfigFiller.setHiClassConfig(token, lessonId, courseCode);
    // 配置互动学堂信息，页面销毁时需调用PLVHiClassGlobalConfig.clear方法清除
    PLVHiClassGlobalConfig.setupConfig(token, userType, PLVSocketUserConstant.USERTYPE_TEACHER.equals(userType), courseCode, lessonId, channelId);
}
```

**3.2 初始化直播间数据管理器**

```java
private void initLiveRoomManager() {
	// 使用PLVLiveChannelConfigFiller配置好直播参数后，用其创建直播间数据管理器实例
    liveRoomDataManager = new PLVLiveRoomDataManager(PLVLiveChannelConfigFiller.generateNewChannelConfig());
    // 设置场次Id
    String sessionId = getIntent().getStringExtra(EXTRA_SESSION_ID);
    liveRoomDataManager.setSessionId(sessionId);
    // 进行网络请求，获取详情课节数据
    liveRoomDataManager.requestLessonDetail();
}
```

**3.3 初始化页面UI**

```java
private void initView() {
    // 先初始化连麦布局
    plvhcLinkmicLy.init(liveRoomDataManager);
    // 初始化状态栏布局
    plvhcStatusBarLy.init(liveRoomDataManager);
    // 初始化工具栏布局
    plvhcToolBarLy.init(liveRoomDataManager);

    // 初始化连麦的媒体配置
    // 省略代码 ...

    // 初始化文档布局
    plvhcDocumentLy.init(liveRoomDataManager);
    // 初始化学生观看倒计时布局
    // ... 省略代码

    // 注册linkMicView
    // 省略代码 ...

    // 进入横屏模式
    PLVScreenUtils.enterLandscape(this);
}
```

根据不同的业务需要，可以选择不同的Layout组合进行初始化。

各个功能模块的布局接口如下：

连麦布局接口：IPLVHCLinkMicLayout

聊天室布局接口：PLVHCChatroomLayout

文档布局接口：IPLVHCDocumentLayout

状态栏布局接口：IPLVHCStatusBarLayout

工具栏布局接口：IPLVHCToolBarLayout

**3.4 设置布局回调**

由于各个功能之间需要进行通信，例如连麦的网络状态改变需要更新状态栏的网络状态UI、工具栏的上下课按钮状态也会根据课节状态而改变，因此每个布局都提供了外部可以使用的回调，方便各个功能模块进行通信。

详细接口介绍请参考各个功能模块的具体介绍文章。

回调设置和处理请参考Activity中的*设置布局回调*方法块。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://polyv.gitbook.io/document/docs/live/android/61-hu-dong-xue-tang-chang-jing-activity.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
