# 4\_1-带货场景（Activity）

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

#### 1 功能概述

带货场景的界面实现为 **PLVECLiveEcommerceActivity**

带货场景下定义的 直播模式、回放模式 的 共用界面。 直播支持的功能有：播放器、聊天室、商品、打赏、互动应用。 回放支持的功能有：播放器。

#### 2 接口介绍

```java
//1.3.0增加viewerAvatar参数

/**
 * 启动直播带货直播页
 *
 * @param activity     上下文Activity
 * @param channelId    频道号
 * @param viewerId     观众ID
 * @param viewerName   观众昵称
 * @param viewerAvatar 观众头像地址
 * @return PLVLaunchResult.isSuccess=true表示启动成功，PLVLaunchResult.isSuccess=false表示启动失败
 */
public static PLVLaunchResult launchLive(@NonNull Activity activity,
                                         @NonNull String channelId,
                                         @NonNull String viewerId,
                                         @NonNull String viewerName,
                                         @NonNull String viewerAvatar);

/**
 * 启动直播带货回放页
 *
 * @param activity      上下文Activity
 * @param channelId     频道号
 * @param vid           视频ID
 * @param viewerId      观众ID
 * @param viewerName    观众昵称
 * @param viewerAvatar  观众头像地址
 * @param videoListType 回放视频类型，参考{@link PolyvPlaybackListType}
 * @return PLVLaunchResult.isSuccess=true表示启动成功，PLVLaunchResult.isSuccess=false表示启动失败
 */
public static PLVLaunchResult launchPlayback(@NonNull Activity activity,
                                             @NonNull String channelId,
                                             @NonNull String vid,
                                             @NonNull String viewerId,
                                             @NonNull String viewerName,
                                             @NonNull String viewerAvatar,
                                             int videoListType);

```

#### 3 实现介绍

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

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

```java
private void initParams() {
    // 获取输入数据
    Intent intent = getIntent();
    boolean isLive = intent.getBooleanExtra(EXTRA_IS_LIVE, true);
    String channelId = intent.getStringExtra(EXTRA_CHANNEL_ID);
    String viewerId = intent.getStringExtra(EXTRA_VIEWER_ID);
    String viewerName = intent.getStringExtra(EXTRA_VIEWER_NAME);

    // 设置Config数据
    PLVLiveChannelConfigFiller.setIsLive(isLive);
    PLVLiveChannelConfigFiller.setupUser(viewerId, viewerName);
    PLVLiveChannelConfigFiller.setupChannelId(channelId);

    // 根据不同模式，设置对应参数
    if (!isLive) { // 回放模式
        String vid = intent.getStringExtra(EXTRA_VID);
        int videoListType = intent.getIntExtra(EXTRA_VIDEO_LIST_TYPE, PolyvPlaybackListType.PLAYBACK);
        PLVLiveChannelConfigFiller.setupVid(vid);
        PLVLiveChannelConfigFiller.setupVideoListType(videoListType);
    }
}
```

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

```java
private void initLiveRoomManager() {
    // 使用PLVLiveChannelConfigFiller配置好直播参数后，用其创建直播间数据管理器实例
    liveRoomDataManager = new PLVLiveRoomDataManager(PLVLiveChannelConfigFiller.generateNewChannelConfig());

    // 进行网络请求，获取上报观看热度
    liveRoomDataManager.requestPageViewer();

    // 进行网络请求，获取直播详情数据
    liveRoomDataManager.requestChannelDetail();
}
```

**3.3 初始化页面UI**

```java
private void initView() {
    // 页面上层ViewPage
    viewPager = findViewById(R.id.watch_info_vp);
    // 初始化共用的UI Fragment
    initEmptyFragment();
    initLiveDetailFragment();
    initCommonHomeFragment();
    // 添加Fragment到页面上层ViewPager中
    PLVViewInitUtils.initViewPager(
            getSupportFragmentManager(),
            viewPager,
            1,
            liveDetailFragment,
            commonHomeFragment,
            emptyFragment
    );
    
    if(liveRoomDataManager.getConfig().isLive()){
    	// 初始化直播的播放器Layout
        videoLayout = new PLVECLiveVideoLayout(this);
    }else{
    	// 初始化回放的播放器Layout
        videoLayout = new PLVECPlaybackVideoLayout(this);
    }
}
```

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

各个Fragment页面及它们支持的功能如下：

* 直播首页：PLVECLiveHomeFragment（支持：主持人信息、聊天室、点赞、商品、打赏）
* 回放首页：PLVECPalybackHomeFragment（支持：主持人信息、播放控制、进度条）
* 直播详情页：PLVECLiveDetailFragment（支持：公告、直播介绍）

各个功能模块也被封装成了Layout类，可以选择不同的Layout组件进行组合。

直播支持的功能有：播放器、聊天室、商品、打赏、互动应用。

回放支持的功能有：播放器。

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

* 播放器布局：IPLVECVideoLayout
* 商品推送布局：PLVECCommodityPushLayout
* 互动应用布局：IPLVInteractLayout
* 打赏弹层布局：PLVECRewardPopupView

**3.4 设置布局回调**

由于各个Fragment和Activity之间需要进行通信，例如播放器的直播开始和直播结束状态会影响到Fragment中播放信息的显示，因此每个Fragment页面都提供了外部可以使用的回调，方便进行通信。

回调设置和数据处理请参考Activity中&#x7684;_&#x6570;据监听 - 监听业务数&#x636E;_&#x548C;_匿名内部类 - view交互事件监听&#x5668;_&#x65B9;法块。
