項目中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調(diào)用方法:window.slifeJsAgent.invoke_native("getUserInfo",params,"jsGetUserInfoCallBack");
- 遇到一個問題虏等,agentweb 中使用js交互弄唧,H5中找不到方法,而且根本不會進(jìn)入到入口函數(shù)invoke_native中霍衫。最終發(fā)現(xiàn)是H5調(diào)用invoke_native的時候少了一個參數(shù)候引,淚奔~~~