AgentWeb中JS交互开发

项目中webview采用了AgentWeb框架,在使用js交互时有些许不一致的地方,下面就简单把在agentweb中的使用介绍一下:
初始化agentweb,并初始化js可用对象

mAgentWeb = AgentWeb.with(this)
            .setAgentWebParent((FrameLayout) flWebContent, new FrameLayout.LayoutParams(-1, -1))
            .useDefaultIndicator()
            .createAgentWeb()
            .ready()
            .go("http://192.168.1.117:82/wallert/html/index.html#/index");
//初始化js交互对象
mAgentWeb.getJsInterfaceHolder().addJavaObject("slifeJsAgent", new AndroidInterfaceWeb(mAgentWeb, getActivity(), this));

AndroidInterfaceWeb.java代码如下:

public class AndroidInterfaceWeb {
private AgentWeb agent;
private Activity activity;
private WebJsInterfaceCallback interfaceCallback;
private String TAG="AndroidInterfaceWeb";
public AndroidInterfaceWeb(AgentWeb agent, Activity activity,WebJsInterfaceCallback interfaceCallback) {
    this.agent = agent;
    this.activity = activity;
    this.interfaceCallback = interfaceCallback;
}

@JavascriptInterface
public void invoke_native(String method, String params, String callbackfunction) {
    Log.e(TAG,"method="+method+";params="+params+";callbackfunction="+callbackfunction);
    ResultModel ret = new ResultModel<>();
    if (!TextUtils.isEmpty(method)) {
        switch (method) {
            case "getUserinfo":
                UserModel userModel = new UserModel();
                AccountModel loginModel = UserInfoRepository.getInstance().getmAccountModel();
                if (loginModel != null) {
                    userModel.setAppToken(loginModel.getUserAccessToken());
                    ret.setCode(0);
                    ret.setData(userModel);
                }else{
                    ret.setCode(-1);
                    ret.setMessage("app没有登录");
                }
                break;
            case "doShare":
                ShareModel shareModel2 = GsonUtil.getGson().fromJson(params,ShareModel.class);
                if(interfaceCallback != null){
                    interfaceCallback.doSahreInfo(shareModel2);
                }
                break;
            case "openNewPage":
                try {
                    JSONObject json = new JSONObject(params);
                    String url = json.getString("url");
                    String title = json.getString("title");
                    Router.newIntent(activity).to(WebActivity.class)
                            .putString(IntentKey.WEB_VIEW_URL,url)
                            .putString(IntentKey.WEB_VIEW_TITLE,title)
                            .launch();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                break;
            case "goLogin":
                if(interfaceCallback != null){
                    interfaceCallback.goLogin(callbackfunction);
                }
                break;
        }
    }
    RXThreadTask.run(AndroidSchedulers.mainThread(), new Consumer() {
        @Override
        public void accept(Object o) throws Exception {
            if(agent != null){
                agent.getJsAccessEntrace().quickCallJs(callbackfunction, GsonUtil.getGson().toJson(ret));
            }
        }
    });
}

public interface WebJsInterfaceCallback {
    void doSahreInfo(ShareModel shareModel);
    void goLogin(String jsCallback);
}
}

注意事项:

  • js调用方法:window.slifeJsAgent.invoke_native("getUserInfo",params,"jsGetUserInfoCallBack");
  • 遇到一个问题,agentweb 中使用js交互,H5中找不到方法,而且根本不会进入到入口函数invoke_native中。最终发现是H5调用invoke_native的时候少了一个参数,泪奔~~~

你可能感兴趣的:(AgentWeb中JS交互开发)