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<UserModel> 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的时候少了一个参数,泪奔~~~
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容