项目中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的时候少了一个参数,泪奔~~~