想必熟悉android开发的同学都知道使用原生 webview 与js 的交互方式,下面我们先来回顾一下。
一、原生 Android webview 与js 的交互方式
webview 通过addJavascriptInterface 进行对象映射
首先要打开交互权限 , 允许使用javascript
webSettings.setJavaScriptEnabled(true);
第一步,进行对象映射,如下所示:
webView.addJavascriptInterface(new JsInterface() , "android");
说明:以上“ JsInterface ”、“android” 都可以自己命名,这里仅做为示例。
第二步,定义一个与JS对象映射关系的Android类 ,并定义JS需要调用的方法, 加入@JavascriptInterface注解
如下所示:
public class JsInterface{
// Android 调用 Js 方法
@JavascriptInterface
public void jsFun(String name,String data){
Log.e("TAG", "jsfun name=="+name);
Log.e("TAG", "jsfun data=="+data);
}
}
通过上面的对象映射及实现后,js就可以使用android对象调用JsInterface 对象中 jsFun 的方法了,如下:
第三步,js 调用android方法
注意 : android就是约定好的映射对象名称, 如下:
function jsCallAndroid(){
//Js调用Android的方法
android.jsFun("name", "params")
}
那么使用 AgentWeb的Webview和js 的交互方式,你知道吗?
其实和原生webview与js的交互还是有些出入的,接下来,我们以代码进行详细说明。
二、AgentWeb的Webview和js 的交互方式
根据文档说明交互方式如下:
mAgentWeb.getWebCreator().getWebView().getSettings().setJavaScriptEnabled(true);
//Javascript 方法
function callByAndroid(){
console.log("callByAndroid")
}
//Android 端
mAgentWeb.getJsEntraceAccess().quickCallJs("callByAndroid");
//结果
consoleMessage:callByAndroid lineNumber:27
//Android 端 , AndroidInterface 是一个注入类 ,里面有一个无参数方法:callAndroid
mAgentWeb.getJsInterfaceHolder().addJavaObject("android",new AndroidInterface(mAgentWeb,this));
//在 Js 里就能通过
window.android.callAndroid() //调用 Java 层的 AndroidInterface 类里 callAndroid 方法
但是文档,并没有给出AndroidInterface的具体实现。
其实原理和原生webview与js的交互是一样的,以下是实现:
public class AndroidInterface {
private AgentWeb agent;
private Context context;
public AndroidInterface(AgentWeb agent, Context context) {
this.agent = agent;
this.context = context;
}
@JavascriptInterface
public void BackToAndroid(){
// send(new BackToHomeEvent());
}
}