Android WebView 与 JavaScript 交互【经典】

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Android WebView 与 JavaScript 交互

November 21, 2015
https://mthli.github.io/Android-WebView-JavaScript

最近在做一些和 WebView 相关的工作,期间涉及到与 JavaScript 交互的操作,网搜了很多博客,感觉写得都不算很好,花了比较多的时间才看明白。在这里重新归纳总结一下,希望对大家有所帮助。

操作前提

因为我们的目标是与 JavaScript 进行交互,因此webView.getSettings().setJavaScriptEnabled(true); 当然是必须的。

通过 WebView 调用 JavaScript 方法

如果只是单纯地想要调用 JavaScript 的方法,可以直接使用webView.loadUrl("javascript:METHOD") 来实现,METHOD 就是你期望的 JavaScript 方法,相当于直接在 Chrome 中按 F12 进入 Console 操作。

需要注意的是,调用 loadUrl() 在 4.4 之前的 WebView 中,会导致网页重载(4.4 之后现象无明显影响),而网页重载会导致软键盘输入焦点消失等问题。

向 JavaScript 中传递参数

首先我们需要注意的一件事是,JavaScript 是弱类型的,所以对于从 Java 中传递的参数,我们需要自己在 JavaScript 中处理,而不能想当然的传进去就用。

对于字符串形式的参数,一定要记住使用单引号 ' 将其包裹,否则 JavaScript(可能)会无法解析这个字符串,提示未定义。

除此意外还要注意一个坑,假设我们希望向 JavaScript 中传递字符串中包含\ 或者 %5C 的子串,那么都会导致在 JavaScript 中的转义,因此我们需要对 \ 或 %5C 进行处理。比如对于 \ 我们就可以做一个字符串替换,变为 \\ ,而 \\ 会被转义为我们真正需要的 \ 。

剩下的事情就很简单啦,比如 JavaScript 中有这么一个方法:

// 插入一段 HTML
function insertHTML(html) {
    ...
} 

在 WebView 中我们就可以这么调用:

String html = ...;
html = html.replaceAll("\\\\", "\\\\\\\\");
webView.loadUrl("javascript:insertHTML('" + html + "')"); 

JavaScript 调用 Java 方法

想要在 JavaScript 中调用相关的 Java 方法,就需要对 WebView 做一些设置了。

首先我们需要在 WebView 中添加 JavaScript 可以直接调用的接口,为了方便起见我就直接将整个 WebView 作为接口对象传递到addJavascriptInterface() 中,同时记住给接口对象起一个名字;

接着我们要给所有 JavaScript 可以调用的 Java 方法添加@JavascriptInterface 的注解;

然后就可以在你的 JavaScript 代码里调用 Java 方法啦。整体代码看起来大概是这样的:

public class MyWebView extends WebView {
    public MyWebView(Context context) {
        ...
        getSettings().setJavaScriptEnabled(true);
        addJavascriptInterface(this, "MyName");
        ...
    }

    @JavascriptInterface
    public void example() {
        ...
    }
} 

在 JavaScript 中这样写:

// 调用 MyWebView 中的 example() 方法
function example() {
    MyName.example();
} 
获取 JavaScript 的返回值

很多时候我们使用 JavaScript 不止是执行一个方法,而是希望得到一个返回值,比如一个布尔值,或者一个字符串。

在 Android 4.4 及其以上版本中, Google 在 WebView 中提供了一个叫做evaluateJavascript() 的方法,当你期望的 JavaScript 方法执行完毕时,会产生一个回调,传回返回值的字符串形式,因此你需要自己手动转换为所需的类型。具体的示例可以参考这个链接

当然我们也可以使用简单并且兼容低版本 Android 的方法来实现。比如我们在 MyWebView 中有这么一个方法:

@JavascriptInterface
public void log(String tag, boolean value) {
    Log.v(tag, String.valueOf(value));
} 

在 JavaScript 中这样写:

function log() {
    MyName.log("tag", true);
} 

JavaBridge 会自动将参数转换为所需的类型,当然前提是你要保证转换一定正确。

关于 UI 层面的修改

Android 只允许在主线程中修改 UI 。如果你在 JavaScript 中调用了 WebView 的方法来修改界面,由于 JavaBridge 并不在主线程中,我们要新建一个位于主线程的 Handler 来操作 UI 。

public class MyWebView extends WebView {
    private Handler handler = new Handler(Looper.getMainLooper());

    ...

    @JavascriptInterface
    public void changeUI() {
        handler.post(new Runnable() {
            ...
        });
    }
} 

Chrome 远程调试

如果你使用的是 Android 4.4 及其以上版本的 WebView ,那么这将是一个非常有用的功能,具体可以参考这个链接

如果你对上述文章还有什么不明白的地方,可以参考 Google 的官方文档

Android webview js(Vue) 交互 js 原生交互分为两种情况:js 调用原生方法,原生调用 js 方法。 本文将对这两种情况分别讲解,H5 端用 vue 实现。 一、前期准备(Vue项目准备) 本文的 H5 端用Vue 实现,所以在正式开始前先把 Vue 项目环境准备好。 项目写好后,执行 npm run serve 命令启动项目,启动成功后会在命令行看到两个地址: http://localhost:8080/ ... 阅读详情

相关推荐

Android通过WebViewJS交互

我们知道,大前端时代已经来了!不管是网页web,还是移动端,通过前端的知识基本都可以解决需求问题。作为一名靠Android平台吃饭的程序员,的确有了些许压力。不过也不用太紧张,个人观点觉得最近几年都是ok的,问题不大。目前市场上流行的做法是,在app的基础上,HTML相结合,实现嵌套交互的效果。因为,大部分应用,都是需要通过用户来实现收益的,因此经常会推出活动来推广运营。这样的情况下,如果每次都...

小猪的博客 3512

android WebView javaScript交互

接触应用层的一些新东西,讲道理先看看官方文档。 基本上有两种方法可以在Android上提供的应用程序:作为一个客户端应用程序(使用Android SDK开发)或Web应用程序(使用Web标准开发并通过Web浏览器的访问)。 android可以通过浏览器访问网页,当然sdk也提供了WebView布局来让网页嵌套到应用中,选择后者当然不能只是简单的将网页放到WebView中,或者说把WebView

qq_31934143的博客 314

WebViewJavaScript交互总结

WebViewJavaScript交互总结 1、交互总结 WebViewJS之间的交互总结可以概括为下面两种: Android客户端去调用JS代码 JS端去调用Android原生代码 它们之间互相调用的桥梁是WebView。 2、交互前准备 2.1 Android客户端代码 Activity: @Override protected void onCreate...

自由奔跑的风 1060

Android WebView JS反射攻击还原(通过echo写入apk文件)

RT 最近在乌云平台上看了披露出来的一些漏洞,因为之前用过

xueerfei的专栏 4283

android webview js交互,AndroidJS交互

现在越来越多的App是混合开发,很需要原生网页交互,下面介绍如何交互以及有可能出现的坑。Java调用JS方法对于Android调用JS方法的方式有2种:通过WebView的loadUrl()通过WebView的evaluateJavascript()方式一:loadUrl()第一步:设置Js交互的权限WebSettings webSettings = mWebView.getSettings(...

weixin_31852627的博客 309

Android WebViewjavaScript交互

操作前提 webview.getSettings().setJavaScriptEnabled(true); 通过webView调用JavaScript方法 webView.loadUrl("javascript:METHOD") 或者 webView.evaluateJavaScript("javascript:METHOD",CallBack) //只能在4.4以上调用,效率高,能拿到返回结...

sanshan_star的博客 309

js android 交互方法,Android WebView JS 的交互方式总结

越来越多的应用采用原生代码Html混合开发的方式,对于这种类型的应用,Android如何JS进行交互呢?本篇就对交互方式进行总结。这边先列下各种交互方式:image.png一、WebView加载Html加载Html的方式这里简单列一下,webview的设置这边不做详细讲解。//加载assets里的test.htmlmWebView.loadUrl("file:///android_asset/...

weixin_40006963的博客 371

Android webviewjs交互

Android 默认方法 对于Android调用JS代码的方法有2种: 通过WebView的loadUrl() 通过WebView的evaluateJavascript() 示例演示:点击Android按钮,即调用WebView JS(文本名为javascript)中callJS() 示例说明:为了方便展示,本文是采用Andorid调用本地JS代码说明;实际情况时,Android更多的是调用远程JS代码,即将加载的JS代码路径改成url即可 方式一:通过WebView的loadUrl() 1、新建 j

Errol's Blog 3662

WebViewJS的交互

WebViewJS的交互

m0_62787113的博客 2441

android webviewjs交互(动态添加js)

Toast.makeText(mContxt, “调用funFromAndroid:” + name, Toast.LENGTH_LONG).show();Toast.makeText(MainActivity.this, “js加载失败”, Toast.LENGTH_SHORT).show();注:此例为本地html本地js交互,如想在本地html添加js,将js.js代码复制到html对应标签内即可。一、本地html本地js交互(本地html引用本地js)读取js添加到String 类型中。

2501_90499563的博客 1480

android webview js 交互框架,安卓中webviewjavascript交互

当我们要实现丰富的图文混排效果的时候,我们一般会使用webview,这是一个功能十分强大的的控件,来看看官方的解释:A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content wit...

weixin_42508114的博客 345

Android WebViewjs交互

今天在网上看到一个js写的抽奖大转盘,觉得很有意思,就像把他集成到安卓里 那么问题来了要集成到安卓里有两个问题 1:用webview加载地址 2:通过webview和js交互 ...

CrackgmKey的博客 4705

Android WebViewJavaScript交互详解

近期工作项目中遇到AndroidWebViewjs交互问题,之前也知道有这方面的技术可以实现。但在用的过程中,却发现还是需要用电心思。 现把我所了解的分享给大家,希望可以帮助到做类似项目的童鞋。 1.首先说一下最简单的一种方式: 为方便演示,就在Android_assets下放置一个html。

sy18298711239的博客 1万+

WebViewjs交互总结

【参考:】 Android webviewjs 交换JSON对象数据 使用Kotlin:让AndroidJS交互的详解 js中eval()的使用说明 简介 使用 WebView 加载网页,有时候需要进行js交互,相互传递数据和响应事件。 android 调用 js 代码: WebView#loadUrl("javascript:func('" + arg + "')") WebView#evaluateJavascript(String script, @Nullable ValueCallbac

wandryoung的博客 1961

WebViewJavaScript交互Android

WebView是移动端用来加载网页的控件,而应用要想直接加载好的网页进行交互,可以通过js也就是JavaScript脚本来完成,所谓交互是指网页可以调用应用内方法(Java方法),应用也可以添加或调用网页相应内容。那么具体该如何实现呢?......

书客创作 2103

安卓混合开发实例——JSJava的交互

今天说说安卓混合开发。 曾经有一个话题是web终会一统app,然后我们看到随着时间的推移。web越来越强大(H5啊,JS各种框架啊),但同时原生app也在不断发展。 或许在将来还会再有这种话题论战,但目前,混合开发,结合web和原生app二者各自的优势,已经是众望所归了。其中最常见的一种方式,在安卓的webview中嵌套web,通过各类设计,让二者进行交互。使得用户体验上几乎无法分辨出究竟是否纯

LeBang的博客 4600

AndroidwebviewJS交互、互调方法

对于试水的功能,一般公司都会采用H5的方式来开发,可以用很少的资源很短的项目工期来完成。 但许多情况下,H5页面会需要一些原生持有的一些如用户信息之类的数据,一些交互也需要调用原生的,如toast之类要保持同一个手机风格一致的交互行为。这个时候就需要能够让JS主动调用原生的方法来进行操作或者获取数据。或者是原生调用JS的方法在H5加载的时候传递一些参数。对于原生调用JS的方法我们需要实现一个We

gengqiquan的博客 1万+

AndroidWebViewJS交互

Html文件: WebViewJS交互方式: 1. 前提: WebSettings webSettings = webView.getSettings(); // 设置Js交互的权限 webSettings.setJavaScriptEnabled(true); webView.setWebChromeClient(new WebChromeClient(){ @Override public boolean onJsAlert(WebView view, String u

#请假条的博客 3204

WebView JavaScript交互

提到如何调试混合页面(Chrome DevTools 远程调试 WebView)。是 Android 4.2(API 17)后的强制要求,防止反射攻击。实现双向通信,无需暴露全局对象,避免命名冲突和安全隐患,且性能更高。合并多次 JS 调用为单次(如通过 JSON 传递批量数据)。,Android 端返回图片 Base64 给 JS。的性能差异(前者支持返回值,后者兼容旧版本)。处理大图时改用文件路径传递,避免内存溢出。使用最小权限原则,仅暴露必要的功能。控制高频事件(如滚动事件)。

斗锋在干嘛的博客 1276
上一篇: Java与JS互掉示例2
下一篇: Android中Java和JavaScript交互代码示例3以及常见问题
Manaasdfasdf
博客等级 码龄11年 131粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值