android中使用tmf框架插件化开发的问题
最近项目开发使用的是tmf框架,其中大多数都是通过源生和H5交互的方式来实现的,大体实现和别的三方框架是一样的,需要按照tmf的官方文档引入一些lib和依赖,添加一些配置等。
我主要就我们在使用做一简单的总结。
大致是使用是项目中创建一个抽象的父类(TMFBaseJsApi)让其extends JsApi,其中JsApi是tmf框架中的类。在TMFBaseJsApi中重写两个核心的方法,分别是:
public abstract class TMFBaseJsApi extends JsApi {
protected final String TAG = "TMFBaseJsApi";
protected long clickTimeMillis = System.currentTimeMillis();
protected static final String STATUS = "status";
protected static final String MESSAGE = "message";
protected static final String CALLBACK_DATA = "callbackData";//回调数据
protected static final String STATUS_SUCC = "0";//成功
protected static final String STATUS_FIAL = "1";//失败
protected static final String STATUS_NETWORK_NONE = "-9999";//无网
protected Activity activity;
@Override
public String method() {
return pluginName();
}
@Override
public void handle(BaseTMFWeb baseTMFWeb, JsCallParam jsCallParam) {
Logs.d(TAG, "TMFBaseJsApi-名称:" + pluginName() + ",参数:" + jsCallParam.paramStr);
this.activity = baseTMFWeb.mActivity;
execute(baseTMFWeb, jsCallParam);
}
以上两个重要的方法,第一个是H5所调用的插件的名字,第二个是handle()这个方法H5调用源生的入口方法,同时您看到在这个方法中调了execute(baseTMFWeb,jsCallParam)这个方法,该方法也是一个抽象方法。
/**
* 调用入口
*/
public abstract void execute(BaseTMFWeb baseTMFWeb, JsCallParam jsCallParam);
该方法是每个客户端写的插件被调到的入口,例如以扫码这个插件为例简单说一下。
目前我们的需求是扫二维码将结果给H5,让H5对扫码的结果进行一些处理。因此我需要些一个插件(也就是一个类)这里定义为addScan(人家定义的类名,莫笑),所有的插件都是继承父类TMFBaseJsApi,需要重写核心的方法,代码如下:
public class addScan extends TMFBaseJsApi {
@Override
public String pluginName() {
return "addScan";
}
`` @Override
public void execute(final BaseTMFWeb baseTMFWeb, final JsCallParam jsCallParam) {
this.baseTMFWeb = baseTMFWeb;`
}
这就写好了一个插件,这里pluginName一定要和H5保持一致,否则调用不到,如果这个插件被H5调用到,则execute()方法就会被执行,而jSCallParam 则是H5需要给源生端传的参数,通常是JSONObject,通常是通过解析Json来拿到我们需要获取的值。比如我们这一步需要从H5获得一些参数,我们只需要加以下代码:
```java
@Override
public void execute(final BaseTMFWeb baseTMFWeb, final JsCallParam jsCallParam) {
this.baseTMFWeb = baseTMFWeb;
//注册扫描结果事件
if (!EventBus.getDefault().isRegistered(this)){
EventBus.getDefault().register(this);
}
try {
JSONObject json = new JSONObject(jsCallParam.paramStr);
JSONObject temp1 = new JSONObject(json.optString("scanCallback"));
// scanFunc = new TestClass();
scanFunc=new JsCallbackFunc();
scanFunc.sessionId = temp1.optString("sessionId");
scanFunc.funcId = temp1.optInt(