Android WebView与JS交互全面详解(小结)

下面我来为你详细讲解“Android WebView与JS交互全面详解(小结)”的完整攻略。

了解Android WebView和JS交互的基本概念

在开始介绍Android WebView与JS交互的具体内容前,我们需要先了解一些基础概念:

  • WebView:Android中的一个内置控件,提供了一个用于显示web界面的View。WebView可以加载网页上的HTML、CSS、JavaScript脚本等内容。
  • JavaScript:一种脚本语言,最初被设计用于网页的交互和动态变化。JS可以通过在网页中内联代码或链接外部文件的方式被引入到网页中。
  • JS Bridge:指在WebView中,实现Java和JavaScript交互的桥梁。

Android WebView与JS交互的方法

实现Android WebView与JS交互的方法大致可分为以下四种:

  1. 通过WebView.loadUrl()方法实现

该方法适合于Java调用JS代码。Java代码可以通过WebView的loadUrl方法来向JS中注入JavaScript代码或者调用JS中的JavaScript函数。具体实现步骤如下:

  • 调用WebView的loadUrl()方法,将JS中的JavaScript代码或者JavaScript函数注入到WebView中,这样JS就可以访问该代码或函数。例如:
webView.loadUrl("javascript:document.getElementById('xxx').innerHTML='xxx'");
  • 在JS中编写JavaScript代码或给JavaScript函数取一个名字,调用Java中的方法,例如:
// JS代码
function jsFunction() {
  window.androidFunction.showMsg();
}

// Java代码
WebView webView = findViewById(R.id.webView);
webView.addJavascriptInterface(new JsInterface(),"androidFunction");

class JsInterface {
    @JavascriptInterface
    public void showMsg() {
        Toast.makeText(MainActivity.this, "JS调用了Java的方法", Toast.LENGTH_LONG).show();
    }
}
  1. 通过WebView.evaluateJavascript()方法实现

该方法适合于Java调用JS代码并获取返回值。Java代码可以通过WebView的evaluateJavascript()方法来调用JS中的JavaScript函数,并获取返回值。具体实现步骤如下:

  • 在JS中编写需要被Java调用的JavaScript代码或函数并给其取一个名字,例如:
// JS代码
function jsFunction(s) {
  return "返回值为:" + s;
}
  • 在Java中调用evaluateJavascript()方法并传入JavaScript函数名和需要传递的参数,此时可以设置一个回调函数,来获取JS函数返回值。例如:
webView.evaluateJavascript("jsFunction('参数值')", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Toast.makeText(MainActivity.this, value, Toast.LENGTH_LONG).show();
            }
        });
  1. 通过添加JS Interface实现

该方法适用于JS调用Java方法。Java代码可以使用addJavascriptInterface()方法将一个Java对象暴露给JS使用,此时JS可以通过该Java对象来调用Java方法。具体实现步骤如下:

  • 在Java中,创建一个对象并注解@JavascriptInterface,例如:
class JsInterface {
    @JavascriptInterface
    public void showToast(String msg) {
        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
    }
}
  • 在WebView中添加JS Interface,例如:
webView.addJavascriptInterface(new JsInterface(), "android");
  • 在JS中使用JavaScript调用该Java对象的方法,例如:
<script type="text/javascript">
    function showToast() {
        window.android.showToast("Javascript调用了Java方法");
    }
</script>
  1. 通过 WebViewClient 的方法实现

该方法适用于捕获JS调用Java的方法。当JS需要调用Java中的方法时,WebView会调用一个shouldOverrideUrlLoading()方法,此时可以通过该方法捕获JS调用的URL并做出相应的处理。具体实现步骤如下:

  • 在JS中,调用某个特定的URL,并添加一些特定的参数,例如:
function JsToJava() {
   var url= "myApp://actionName?params1"+params1+"&params2="+params2;
   location.href=url;         
}
  • shouldOverrideUrlLoading()方法中,解析URL并调用Java方法,例如:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
   Uri uri=Uri.parse(url);
   if (uri.getScheme().equals("myApp")) {
      if (uri.getHost().equals("actionName")) {
          String params1 = uri.getQueryParameter("params1");
          String params2 = uri.getQueryParameter("params2");
          Toast.makeText(WebviewActivity.this, "JS调用了Java方法:" + params1, Toast.LENGTH_LONG).show();
      }
      return true;
   }
   return super.shouldOverrideUrlLoading(view, url);
}

示例说明

下面给出两个示例说明:

示例一

在JS中调用Java方法,并返回结果。具体实现步骤如下:

<!--在HTML中编写调用Java的JS代码-->
<button onclick="getAndroidVersion()">获取Android系统版本号</button>
<script type="text/javascript">
function getAndroidVersion() {
    var version = window.android.getAndroidVersion();
    alert(version);
}
</script>

// 在MainActivity中调用evaluateJavascript方法
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        //JS代码执行完成后,调用JS中的方法获取Android系统版本号
        webView.evaluateJavascript("javascript:getAndroidVersion()", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                Toast.makeText(MainActivity.this, value, Toast.LENGTH_LONG).show();
            }
        });
    }
});
webView.loadUrl("file:///android_asset/index.html");

// 在JsInterface中添加getAndroidVersion方法
@JavascriptInterface
public String getAndroidVersion() {
    return Build.VERSION.RELEASE;
}

示例二

在Java中调用JS代码。具体实现步骤如下:

// 在MainActivity中调用loadUrl方法
webView.loadUrl("javascript:document.getElementById('xxx').innerHTML='Hello World!'");

// 在JS中编写需要被调用的函数
function jsFunction() {
    window.androidFunction.showMsg();
}

// 在JsInterface中添加showMsg方法
@JavascriptInterface
public void showMsg() {
    Toast.makeText(MainActivity.this, "JS调用了Java方法", Toast.LENGTH_LONG).show();
}

以上就是Android WebView与JS交互的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android WebView与JS交互全面详解(小结) - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 详解Angular中通过$location获取地址栏的参数

    以下是详解Angular中通过$location获取地址栏的参数的完整攻略: 1. 简介 在Angular中,我们可以通过使用$location服务获取地址栏中的URL信息,包括协议、域名、路径和查询参数等。$location是Angular中的一个内置服务,在跟踪URL和路由变化方面非常有用。 2. 使用示例 示例1:获取查询参数 我们首先创建一个控制器,…

    JavaScript 2023年6月11日
    00
  • JS实现简单网页倒计时器

    下面我将详细讲解一下如何通过JS实现简单网页倒计时器。 1. 首先,我们需要创建一个HTML页面 在HTML文件中,我们需要定义一个显示倒计时的区域,并为它设置一个id,例如: <div id="countdown"></div> 2. 然后,在JavaScript代码中,我们需要定义倒计时的时间和计时器函数 例如…

    JavaScript 2023年5月27日
    00
  • JS如何实现一个单文件组件

    要实现一个单文件组件,我们需要使用Vue.js这个通用的组件框架来开发。 以下是实现一个单文件组件的步骤: 第一步:安装和配置Vue.js 在项目文件夹下运行以下命令安装Vue.js npm install -g vue 创建一个Vue项目 vue create my-project 运行Vue项目 cd my-project npm run serve 第…

    JavaScript 2023年5月27日
    00
  • backbone简介_动力节点Java学院整理

    Backbone.js 简介 – 动力节点Java学院整理 什么是 Backbone.js Backbone.js是一个用于构建单页应用程序(Single Page Application)的JavaScript框架。它将应用程序的数据模型(Model)、用户界面(View)以及用户与之交互的程序逻辑(Controller)分离开来,并为它们提供了统一的界面…

    JavaScript 2023年6月11日
    00
  • JavaScript 设计模式学习 Singleton

    对于“JavaScript 设计模式学习 Singleton”的完整攻略,可以分为以下步骤: 1. 了解 Singleton 模式的定义与原理 Singleton 模式是一种创建型设计模式,它确保某个类只有一个实例,并提供一个全局访问点。 Singleton 模式主要包含三个要素:私有化构造函数、私有化静态属性和一个提供全局访问的静态方法。 在 JavaSc…

    JavaScript 2023年6月10日
    00
  • JavaScript数组及常见操作方法小结

    JavaScript数组及常见操作方法小结 JavaScript中的数组是一组有序的数据集合,可以存储不同类型的数据,包括数字、字符串、对象、甚至是其他数组。本文将介绍JavaScript数组常见的操作方法。 创建数组 在JavaScript中,可以通过以下两种方式来创建一个数组。 直接赋值法 直接赋值法是指在一个变量名后使用一对方括号来创建一个数组。例如:…

    JavaScript 2023年5月27日
    00
  • js实现无刷新监听URL的变化示例代码详解

    首先,我们需要明确什么是URL的变化。以单页面应用(SPA)为例,当用户在页面内部进行操作时,可能会通过JavaScript动态更新URL的参数或片段,实现页面内容的变化。但是,这种变化不会像页面刷新那样引起整个页面的重新加载。 如果我们想要对URL的变化进行监听,有两种方法可以选择。 方法一:使用window.onhashchange事件 在HTML5规范…

    JavaScript 2023年6月11日
    00
  • js数组去重的5种算法实现

    JS数组去重的5种算法实现 1. 利用Set数据结构 使用Set数据结构是JS中去重最简单的方法,它可以快速对数组进行去重,这种方式不需要对原数组进行操作,不会改变原数组。 let arr = [1, 1, 2, 3, 2, 4, 5, 5]; let uniqueArr = […new Set(arr)]; console.log(uniqueArr)…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部