Android WebView与Native通信总结

webView.evaluateJavascript("(function() { return " + command + “; })();”, new ValueCallback() {
@Override
public void onReceiveValue(String result) {
// 此处的result便是 ABC
}
});

Javascript 向 Native 发送数据

Javascript向Native发送数据有4种方式,第一种方式是借助webChromClient中的onJsAlert(), onJsPromot()的方法来获取Javascript相关数据。第二种方式是采用覆盖shouldOverrideUrlLoading方法,拦截url协议。第三种是最方便的,也就是@JavascriptInterface方案, 现在大多数App都会用到这种方式, 后面会详细介绍。最后一种是利用在webView中嵌入iframe的方式,通过更新iframe的url。比较出名的混合框架JsBridge之前就是采用这种方式,现已改成采用@JavascriptInterface这种方式了。以下简单介绍一下各种方式的使用。

onJsPrompt

webChromeClient中提供了onJsAlert, onJsPrompt方法,方便开发者重写Javascript中的alert, prompt方法对应的行为。我们可以在这两个方法中任选一个做为native和js进行交互的桥梁。通常我们借助于onJsPrompt 方法来实现, 就是因为在js中,这个方法通常我们用得比较少。而对于onJsAlert(), 当调用js中的alert()时会触发,我们可以通过重写这个方法来实现自定义的提示View

但是这种方式对传入的数据量有限制,和手机的WebView版本有关,以我的测试机为例,在oppo reno手机 android 10上面, 其传递数据最多只能是10k。 而用@JavascriptInterface 方案, 传递的数据最多可达20 - 30M

我们来看前端网页的写法, 直接调用prompt函数

var data = prompt(“native://getUserInfo?id=1”);
console.log(‘data:’ + data);

在为WebView设置WebChromeClient的时候重写onJsPrompt方法,如下:

@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
Uri uri = Uri.parse(message);
//如果是调nativeAPI.
if (url.startsWith(“native://”)) {
result.confirm(“call natvie api success”);
return true;
}
return super.onJsPrompt(view, url, message, defaultValue, result);
}

shouldOverrideUrlLoading

前端页面的Js代码:

document.location=“native://getUserInfo?id=1”;

native层面在为WebView设置WebViewClient对象时,我们需要重写shouldOverrideUrlLoading方法。需要注意的是,WebViewClient中有两个shouldOverrideUrlLoading方法的定义:

  • public boolean shouldOverrideUrlLoading(WebView view, String url)
  • public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

其中上面一个在sdk中已被标记Deprecate

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值