android 的webView加载h5,和h5的交互(java和JavaScript的交互)

2024-09-07 08:48

本文主要是介绍android 的webView加载h5,和h5的交互(java和JavaScript的交互),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。(通俗点说就是,点击那个Web页面的按钮啥的,可以传到原生app;或者原生app调用Web页面的js方法)

如何实现

实现Java和js交互十分便捷。通常只需要以下几步。

  • WebView开启JavaScript脚本执行
  • WebView设置供JavaScript调用的交互接口。
  • 客户端和网页端编写调用对方的代码。

本例代码

为了便于讲解,先贴出全部代码

Java代码

package com.example.testjs;import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
//参考文档http://www.igooda.cn/jzjl/20141212737.html
public class MainActivity extends Activity {private static final String LOGTAG = "MainActivity";@SuppressLint("JavascriptInterface")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final WebView myWebView = (WebView) findViewById(R.id.myWebView);WebSettings settings = myWebView.getSettings();settings.setJavaScriptEnabled(true);//注入接口//js_java_interaction.html文件中的toastMessage(),sumToJava()方法中的window后面的字段myWebView.addJavascriptInterface(new JsInteration(), "control");myWebView.setWebChromeClient(new WebChromeClient() {});myWebView.setWebViewClient(new WebViewClient() {@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);testMethod(myWebView);}});myWebView.loadUrl("file:///android_asset/js_java_interaction.html");}private void testMethod(WebView webView) {
//		只能一次
//		String call = "javascript:sayHello()";
//
//		String call = "javascript:alertMessage(\"" + "content" + "\")";
//
//		String call = "javascript:toastMessage(\"" + "content" + "\")";String call = "javascript:sumToJava(1,2)";webView.loadUrl(call);}//返回结果的处理public class JsInteration {@JavascriptInterfacepublic void toastMessage(String message) {Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();}
//		onSumResult字段和 window.control.onSumResult(number1 + number2)中的onSumResult一样@JavascriptInterfacepublic void onSumResult(int result) {Log.i(LOGTAG, "onSumResult result=" + result);}}}

前端网页代码

<html>
<script type="text/javascript">function sayHello() {alert("Hello")}function alertMessage(message) {alert(message)}function toastMessage(message) {window.control.toastMessage(message)}function sumToJava(number1, number2){window.control.onSumResult(number1 + number2)}
</script>
Java-Javascript Interaction In Android
</html>

下面介绍下

如何调用  

(1)addJavascriptInterface方法

此方法有两个参数,第一个参数就是我们一般会实现一个自己的类,类里面提供我们要提供给javascript访问的方法;第二个参数是访问我们在obj中声明的方法时候所用到的js对象,调用模式为window.interfaceName.方法名()或者是javascript: interfaceName.方法名() ;,如myWebView.addJavascriptInterface(new JsInteration(), "control");
(2)js调用Java

调用格式为window.jsInterfaceName.methodName(parameterValues) 此例中我们使用的是control作为注入接口名称。

function toastMessage(message) {window.control.toastMessage(message)
}function sumToJava(number1, number2){window.control.onSumResult(number1 + number2)
}

(3)Java调用JS

webView调用js的基本格式为webView.loadUrl(“javascript:methodName(parameterValues)”)

       调用js无参无返回值函数

String call = "javascript:sayHello()";
webView.loadUrl(call);

    调用js有参无返回值函数

注意对于字符串作为参数值需要进行转义双引号。

String call = "javascript:alertMessage(\"" + "content" + "\")";
webView.loadUrl(call);

      调用js有参数有返回值的函数

Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。

1.Java调用js代码

String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);

2.js函数处理,并将结果通过调用java方法返回

function sumToJava(number1, number2){window.control.onSumResult(number1 + number2)
}

3.Java在回调方法中获取js函数返回值

@JavascriptInterface
public void onSumResult(int result) {Log.i(LOGTAG, "onSumResult result=" + result);
}

4.4处理

Android 4.4之后使用evaluateJavascript即可。这里展示一个简单的交互示例 具有返回值的js方法

function getGreetings() {return 1;
}

java代码时用evaluateJavascript方法调用

private void testEvaluateJavascript(WebView webView) {webView.evaluateJavascript("getGreetings()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {Log.i(LOGTAG, "onReceiveValue value=" + value);}});
}

输出结果

I/MainActivity( 1432): onReceiveValue value=1

注意

  • 上面限定了结果返回结果为String,对于简单的类型会尝试转换成字符串返回,对于复杂的数据类型,建议以字符串形式的json返回。
  • evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。
好了总体的就这么多了

还有一些错误的话可以参考,代码混淆的话参考原文: http://www.igooda.cn/jzjl/20141212737.html
最后贴下文中使用的demo吧:http://www.oschina.net/code/snippet_2702417_58168

当然如果觉得这边不太好的话还可以看看:http://www.cnblogs.com/lee0oo0/archive/2012/08/01/2617953.html
android 和h5交互基础篇 http://www.jianshu.com/p/a25907862523?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io  http://www.jianshu.com/p/a25907862523?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

这篇关于android 的webView加载h5,和h5的交互(java和JavaScript的交互)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144615

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期