想必熟悉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 的交互方式
根据文档说明交互方式如下:
android 调用 javascript
mAgentWeb.getWebCreator().getWebView().getSettings().setJavaScriptEnabled(true); //Javascript 方法 function callByAndroid(){ console.log("callByAndroid") } //Android 端 mAgentWeb.getJsEntraceAccess().quickCallJs("callByAndroid"); //结果 consoleMessage:callByAndroid lineNumber:27
javascript 调用 android
//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()); } }