MADP3.0 Android 接口说明

1、集成

依赖

种子工程的app/imunutable/libs/MADCore_GREEN.aar为MADP3.0 SDK,后续会间断性的提供完善版本。

此外在build.gradle的dependencies节点中添加以下依赖。

dependencies {
  implementation 'com.android.support:appcompat-v7:28.0.0'
  implementation 'com.android.support:recyclerview-v7:28.0.0'
  implementation 'com.android.support:design:28.0.0'
  implementation 'com.github.bumptech.glide:glide:4.9.0'
  implementation 'com.alibaba:fastjson:1.2.83'
}

注册表

registry.dat放到assets目录下

更多注意事项请参考文档 SDK集成与使用手册

2、初始化

详情参考MADP2.0 Android初始化接口

   EnvironmentConfig config = new EnvironmentConfig.Builder()
                .setOpenLog(false)
                .setOpenCockroach(false)
                .setUsePortService(false)
                .setLaunchModel(MADConfig.LaunchModel.SYNC)
                .setHttpProxy("")
                .setGrayFlag(0)
                .setCustomHttpAdapter(null)
                .setNeedDeviceID(true)
                .setNeedVerifyProcessInfo(true)
                .build();
  Engine.initEnvironment(app, config, callback);

3、类说明

3.1 MADCompEngine

public class MADCompEngine

入口类,主要用于初始化以及注册自定义容器、组件

Method

返回值 方法名称
void init()
void registerContainer(String type, Class<? extends MADContainer> clazz)
void registerComponent(String type, Class<? extends MADComponent> clazz)
void registerNTBItemView(String type, Class<? extends NTBItemView> clazz)
void registerTitleItemView(String type, Class<? extends MADTitleItemComponent> clazz)

init

初始化,并注册内置组件,

**注意:**MADP初始化时已经调用,您无需使用该接口,此处仅做说明。

registerContainer

public static void registerContainer(String type, Class<? extends MADContainer> clazz)

注册自定义容器

类型 说明
type 容器类型,与后管中的pageType保持一致
clazz 自定义容器Class,需要继承MADContainer,详情参考MADContainer.class说明

registerComponent

public static void registerComponent(String type, Class<? extends MADComponent> clazz)

注册自定义组件

类型 说明
type 组件类型,与后管中的type保持一致
clazz 自定义组件Class,需要继承MADComponent,详情参考MADComponent.class说明

registerNTBItemView

public static void registerNTBItemView(String type, Class<? extends NTBItemView> clazz)

注册自定义导航栏item样式

类型 说明
type 导航栏按钮类型,与后管中的type保持一致
clazz 自定义导航栏item Class,需要继承NTBItemView,详情参考NTBItemView.class说明

registerTitleItemView

public static void registerTitleItemView(String type, Class<? extends MADTitleItemComponent> clazz) 

注册自定义导航栏item样式

类型 说明
type 标题按钮类型,与后管中的type保持一致
clazz 自定义标题栏按钮Class,需要继承MADTitleItemComponent,详情参考MADTitleItemComponent.class说明

3.2 IActivityStateListener

public interface IActivityStateListener 

Activity生命周期监听回调。

Method

返回类型 方法
void onActivityCreate()
void onActivityStart()
void onActivityPause()
void onActivityResume()
void onActivityStop()
void onActivityDestroy()
boolean onActivityBack()
void onActivityResult(int requestCode, int resultCode, Intent data)

3.3 MADContainer

public abstract class MADContainer implements IActivityStateListener

容器:页面基础,加载组件的载体,此类代表容器基础模块,自定义容器需要继承MADContainer

已实现的容器

类型 说明
tab 导航栏,目前仅用于首页
listPage 首页列表
splash 闪屏
errorpage 错误页面

Method

返回类型 方法名称
View viewContainer(Context context, Object data)
void addComponent(MADComponent component)
void addContainer(MADContainer container)
ContextPool.MADContext getMadContext()
void destroy()
void onViewAttachedToWindow(Context context, RecyclerView.ViewHolder holder)
void onViewDetachedFromWindow(Context context, RecyclerView.ViewHolder holder)
void onViewRecycled(Context context, RecyclerView.ViewHolder holder)

viewContainer

public View viewContainer(Context context, Object data)

绘制容器

参数

类型 说明
context android.content.Context
data 容器数据,解析后管配置,包括宽高、背景色等

返回值

View:返回当前容器View,SDK会将View添加到对应的ViewGroup中。

addComponent

public void addComponent(MADComponent component)

添加当前容器内需要渲染的组件

参数

参数 说明
component 继承了MADComponent的class

addContainer

public void addContainer(MADContainer container) 

添加当前容器需要嵌套的子容器

参数

参数 说明
container 继承了MADContainer的Class

getMadContext

public ContextPool.MADContext getMadContext() 

获取MADContext对象,使用场景、持久化存储等API

参数

destroy

public void destroy()

销毁当前容器,自定义容器需要在此处回收资源

参数

onViewAttachedToWindow(暂未实现)

public void onViewAttachedToWindow(Context context, RecyclerView.ViewHolder holder)

组件在RecyclerView中展示,仅容器内引用RecyclerView时需要实现此接口。

参数

参数 说明
context android.content.Context实例
holder ViewHolder实例

onViewDetachedFromWindow(暂未实现)

public void onViewDetachedFromWindow(Context context, RecyclerView.ViewHolder holder)

组件在RecyclerView中隐藏,仅容器内引用RecyclerView时需要实现此接口。

参数

参数 说明
context android.content.Context实例
holder ViewHolder实例

onViewRecycled(暂未实现)

public void onViewRecycled(Context context, RecyclerView.ViewHolder holder)

组件被RecyclerView回收,仅容器内引用RecyclerView时需要实现此接口。

参数

参数 说明
context android.content.Context实例
holder ViewHolder实例

3.4 MADComponent

public abstract class MADComponent implements IActivityStateListener 

此类代表组件基础模块,自定义组件需要继承MADComponent

已实现的组件

组件 描述
banner 轮播广告
richText 画布
menu 菜单
notice 公告
dynamicCar 动态卡

Method

返回类型 方法
RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, Object data)
void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, Object data)
void onViewAttachedToWindow(Context context, RecyclerView.ViewHolder holder)
void onViewDetachedFromWindow(Context context, RecyclerView.ViewHolder holder)
void onViewRecycled(Context context, RecyclerView.ViewHolder holder)

onCreateViewHolder

public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, Object data)

创建一个新的ViewHolder并初始化一些供RecyclerView使用,组件是首页楼层类型时,必须实现此接口

参数

类型 说明
viewGroup ViewGroup
data 组件数据,解析后管配置,包括宽高、背景色等

返回值

RecyclerView.ViewHolder:用于RecyclerView.Adapter添加组件。

onBindViewHolder

public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, Object data)

更新组件数据

参数

类型 说明
viewHolder 组件 VH
data 组件数据,解析后管配置,包括宽高、背景色等

onViewAttachedToWindow(暂未实现)

public void onViewAttachedToWindow(Context context, RecyclerView.ViewHolder holder)

当此适配器创建的视图已附加到窗口时调用

参数

类型 说明
context android.content.Context
holder 组件 VH,所附加视图的持有者

onViewDetachedFromWindow(暂未实现)

public void onViewDetachedFromWindow(Context context, RecyclerView.ViewHolder holder)

当此适配器创建的视图已与其窗口分离时调用

参数

类型 说明
context android.content.Context
holder 组件 VH,所附加视图的持有者

onViewRecycled(暂未实现)

public void onViewRecycled(Context context, RecyclerView.ViewHolder holder)

当此适配器创建的视图已被回收时调用。

参数

类型 说明
context android.content.Context
holder 组件 VH,所附加视图的持有者

3.5 MADSingleComponent

public abstract class MADSingleComponent extends MADComponent 

MADComponent的子类,包含MADComponent的接口,用于特殊组件的开发。

已实现的组件:

组件 说明
adbanner 首页弹窗广告
exitalert 首页返回退出提示弹窗
adfloat 首页悬浮按钮
update 更新提示组件

Method

返回类型 方法
void onCreate(Context context, ViewGroup parent, Object data)

onCreate

public abstract void onCreate(Context context, ViewGroup parent, Object data);

参数

参数 说明
context android.content.Context 实例
parent 父容器
data 组件数据,包括宽高、背景色等配置数据

3.6 NTBItemView

public abstract class NTBItemView extends RecyclerView.OnScrollListener

导航栏自定义item模板。

已实现的组件:

组件 说明
normal 常用标准组件:上图下文
special 特殊组件,单独大图

Method

返回类型 方法
View createView(ViewGroup viewGroup, NTBModel.NTBItemModel itemModel,boolean selected);
void setSelected(boolean selected);
void onItemClick()
void onScrolled(RecyclerView recyclerView, int dx, int dy)

onCreate

public abstract View createView(ViewGroup viewGroup, NTBModel.NTBItemModel itemModel,boolean selected);

参数

参数 说明
viewGroup 父容器视图
itemModel 数据模型
selected 是否被选中

setSelected

public abstract void setSelected(boolean selected);

选中状态,根据selected更新按钮ui

参数

参数 说明
selected 是否被选中

onItemClick

public boolean onItemClick();

item点击事件,当item需要自定义点击事件时,返回true,并添加自定义逻辑,否则返回false,由标题栏执行默认操作(切换tab)

返回值

参数 说明
true 需要item自定义点击事件
false 不需要item自定义点击事件

onScrolled

public void onScrolled(RecyclerView recyclerView, int dx, int dy) 

对应列表滚动事件,若想事项导航栏按钮与列表的联动,需要实现此接口

参数 说明
recyclerView RecyclerView实例
dx 横向滚动偏移量
dy 纵向滚动偏移量

3.7 MADTitleItemComponent

public abstract class MADTitleItemComponent extends MADComponent

MADComponent的子类,包含MADComponent的接口,当内置的标题栏无法满足UI设计时可以继承此类。

已实现的组件:

组件 说明
image 图标

Method

返回类型 方法
View createView(Context context, TitleItemModel model);

createView

public abstract View createView(Context context, TitleItemModel model);

参数

参数 说明
context android.content.Context 实例
model 后管数据

3.8 CallBackFunction

客户端将接口回调给前端

方法

返回值 方法
void onCallBack(String data)

onCallBack

public void onCallBack(String data);

当客户端在BaseBridgeHandler插件中完成业务流程处理后,将结果通过onCallBack返回给前端

参数 说明
data 需要传递给前端的数据

3.9 BaseBridgeHandler

插件模板,自定义的插件需要继承自BaseBridgeHandler。

变量

变量名 类型 说明
mActivity android.app.Activity 当前插件所在的Activity实例
methodName String 当前插件的名称

方法

返回值 方法
void handler(String data, CallBackFunction function)
void onActivityResult(int requestCode, int resultCode, Intent data)

handler

public abstract void handler(String data, CallBackFunction function);

H5交互时会触发handler(String data, CallBackFunction function)

参数

参数 说明
data 前端传递到原生的数据
function 当业务数据处理完成后,将需要处理的数据通过function传递给前端

onActivityResult

public void onActivityResult(int requestCode, int resultCode, Intent data) 

如果在插件中使用到了startActivityForResult,需要重写onActivityResult方法,需要注意比对requestCode

参数 说明
requestCode 请求码
resultCode 返回码
data 返回数据

4 示例

4.1 自定义首页组件

1)创建组件

创建类PlaceHolderComponent,继承MADComponent

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;

import tech.madp.core.utils.MADPLogger;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.alibaba.fastjson.JSONObject;

import tech.madp.core.component.R;
import tech.madp.core.component.common.MADComponent;
import tech.madp.core.component.model.ComponentModel;

public class PlaceHolderComponent extends MADComponent {
    private static final String TAG = "PlaceHolderComponent";

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, Object data) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(
                R.layout.components_placeholder, viewGroup, false);
        return new PlaceHolderViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, Object data) {
        MADPLogger.d(TAG, "onBindViewHolder: viewHolder = " + viewHolder + ", data = " + data);
        if (viewHolder instanceof PlaceHolderViewHolder) {
        }
    }

    public static class PlaceHolderViewHolder extends RecyclerView.ViewHolder {
        public PlaceHolderViewHolder(View v) {
            super(v);
        }
    }
}

2)注册组件

在应用启动时(Application或LaunchActivity)注册组件PlaceHolderComponent

MADCompEngine.registerComponent("test", PlaceHolderComponent.class);

4.2 自定义标题栏组件

1)创建组件

创建类TitleImgComponent,继承MADTitleItemComponent

import android.content.Context;
import android.view.View;
import android.widget.ImageView;

import tech.madp.core.component.common.MADTitleItemComponent;
import tech.madp.core.component.model.TitleItemModel;
import tech.madp.core.component.utils.ActionTool;
import tech.madp.core.component.utils.ImgTool;

public class TitleImgComponent extends MADTitleItemComponent {

    @Override
    public View createView(Context context, TitleItemModel model) {
        ImageView imageView = new ImageView(context);
        ImgTool.setImageBg(context, imageView, model.getImage());
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ActionTool.open(model.getAction());
            }
        });
        return imageView;
    }
}

2)注册组件

在应用启动时(Application或LaunchActivity)注册组件MADTitleItemComponent

MADCompEngine.registerTitleItemView("image", TitleImgComponent.class);

4.3 自定义导航栏组件

1)创建组件

创建类NormalNTBItemView,继承NTBItemView

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import tech.madp.core.component.R;
import tech.madp.core.component.model.NTBModel;
import tech.madp.core.component.utils.ColorTool;
import tech.madp.core.component.utils.DimenTool;
import tech.madp.core.component.utils.ImgTool;
import tech.madp.core.component.utils.TextTool;

public class NormalNTBItemView extends NTBItemView {

    private NTBModel.NTBItemModel itemModel;
    private TextView spaceItemText;
    private ImageView spaceItemIcon;
    private Context context;

    @Override
    public View createView(ViewGroup viewGroup, NTBModel.NTBItemModel itemModel, boolean selected) {
        context = viewGroup.getContext();
        this.itemModel = itemModel;
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout.LayoutParams textAndIconContainerParams = new LinearLayout.LayoutParams(
                0, itemModel.getTabHeight(), 1);
        RelativeLayout textAndIconContainer = (RelativeLayout) inflater.inflate(R.layout.comp_ntb_normal_item_view, viewGroup, false);
        textAndIconContainer.setLayoutParams(textAndIconContainerParams);
        textAndIconContainer.setBackgroundColor(ColorTool.toColorInt(itemModel.getBackgroundColor(), Color.WHITE));
        spaceItemIcon = (ImageView) textAndIconContainer.findViewById(R.id.space_icon);
        spaceItemText = (TextView) textAndIconContainer.findViewById(R.id.space_text);
        ImgTool.setImageBg(context, spaceItemIcon, itemModel.getImg());
        spaceItemText.setText(itemModel.getName());
        spaceItemText.setTextSize(itemModel.getFontsize());
        if (itemModel.getIndexID() != -1)
            textAndIconContainer.setId(itemModel.getIndexID());
        if (TextTool.isEmpty(itemModel.getImg()))
            Utils.changeViewVisibilityGone(spaceItemIcon);
        ViewGroup.LayoutParams iconParams = spaceItemIcon.getLayoutParams();
        int size = DimenTool.mad2px(itemModel.getImgSize()) == 0 ? ViewGroup.LayoutParams.WRAP_CONTENT : DimenTool.mad2px(itemModel.getImgSize());
        iconParams.height = size;
        iconParams.width = size;
        spaceItemIcon.setLayoutParams(iconParams);
        if (TextTool.isEmpty(itemModel.getName())) {
            Utils.changeViewVisibilityGone(spaceItemText);
        }
        setSelected(selected);
        return textAndIconContainer;
    }

    @Override
    public void setSelected(boolean selected) {
        if (spaceItemIcon == null || spaceItemIcon == null)
            return;
        if (selected) {
            spaceItemText.setTextColor(ColorTool.toColorInt(itemModel.getSelectedColor()));
            ImgTool.setImageBg(context, spaceItemIcon, itemModel.getSelectedImg());
        } else {
            spaceItemText.setTextColor(ColorTool.toColorInt(itemModel.getUnselectedColor()));
            ImgTool.setImageBg(context, spaceItemIcon, itemModel.getImg());
        }
    }
}

2)注册组件

在应用启动时(Application或LaunchActivity)注册组件NormalNTBItemView

MADCompEngine.registerNTBItemView("normal", NormalNTBItemView.class);

4.4 自定义JSBridge插件

1)创建插件

创建类TestBridgeHandler,继承BaseBridgeHandler

import com.alibaba.fastjson.JSONObject;

import tech.madp.core.component.utils.TextTool;
import tech.madp.core.jsbridge.BaseBridgeHandler;
import tech.madp.core.jsbridge.CallBackFunction;

public class TestBridgeHandler extends BaseBridgeHandler {

    @Override
    public void handler(String data, CallBackFunction function) {
        String result = "test data";
        function.onCallBack(handlerSuccess(result).toJSONString()); //回传数据给js
    }

    private JSONObject handlerSuccess(String data) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("state", "success");
        jsonObject.put("data", data);
        return jsonObject;
    }

    private JSONObject handlerFail(String msg) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("state", "fail");
        if (!TextTool.isEmpty(msg))
            jsonObject.put("errMsg", msg);
        return jsonObject;
    }
}

2)注册插件

在应用启动时(Application或LaunchActivity)注册组件TestBridgeHandler

BridgeHandlerManager.registerHandler("test", TestBridgeHandler.class);