Kotlin与H5通信的实现方式

news2025/2/28 6:16:40

Kotlin与H5通信

    • 1、H5中主动的调用Kotlin中的程序
        • 1编写后端程序并且在服务器上运行
        • 2准备好AndroidStudio的界面布局中的WebView
        • 3编写工具类用来处理H5调用逻辑
        • 4通过addJavascriptInterface来构建桥梁
        • 5结果展示
    • 2在Kotlin中调用H5的程序
        • 1在H5中编写方法,来处理Kotlin的请求
        • 2在Kotlin中调用方法
        • 3结果展示
    • 3使用CallBack机制来实现H5中发起请求到Kotlin,然后Kotlin去 将响应的结果返回给Kotlin.
        • 1在H5中编写发起请求和响应请求的函数
        • 2编写处理请求的函数
        • 3主程序中

1、H5中主动的调用Kotlin中的程序

要知道kotlin和html是两种不同的程序,并且一个运行在手机的android端,一个运行在服务器的后端程序,让这两种不同运行环境的不同编程语言进行通信,需要用到addJavascriptInterface方法,来进行数据的访问和方法的调用
下面开始一些环境准备工作

1编写后端程序并且在服务器上运行

运行的端口是http://localhost:8080/bmi/,主要就是一个可以根据人的身高和体重计算出BMI值的小程序还有一个点击之后就可以调用kotlin程序的按钮
在这里插入图片描述其中jsp文件为

<%--
  Created by IntelliJ IDEA.
  User: 26678
  Date: 2021/4/5
  Time: 16:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>测量BMI值</title>
  </head>

  <script type="text/javascript">
    function search() {
      //1
      var xmlHttp=new XMLHttpRequest()
      //2
      xmlHttp.onreadystatechange=function(){
        if(xmlHttp.readyState==4&&xmlHttp.status==200){
          var mess=xmlHttp.responseText;
        //要分开获取,先获得对象,才能给value赋值
          var obj=document.getElementById("dis")
          obj.value=mess


          document.getElementById("disbim").innerHTML=mess
          //alert(mess)
        }
      }
      //3
      var name=document.getElementById("name").value
      var weight=document.getElementById("w").value
      var height=document.getElementById("h").value
      var message="name="+name+"&w="+weight+"&h="+height
      xmlHttp.open("get","one?"+message,true)//这里面第二个数据是打开对应的服务器地址
      //4
      xmlHttp.send()
    }

    function showKotlin() {
      var jsonData={"name":"海航"}
      /*在当前窗口下使用通信桥梁来调用kotlin中的程序*/
      window.jsInterface.showToast(JSON.stringify(jsonData))
    }
  </script>

  <body>
  <table>
    <tr>
    <td>用户姓名</td>
    <td><input type="text" id="name"></td>
  </tr>
    <tr>
      <td>您的身高</td>
      <td><input type="text" id="h"></td>
    </tr>
    <tr>
      <td>您的体重</td>
      <td><input type="text" id="w"></td>
    </tr>
  </table>
  <br>
  <input type="button" value="获取BMI值" onclick="search()"><br>
  <input type="text" value="bim=" id="dis">
  <div id="disbim">请点击提交来显示您的bim值</div>

  <input type="button" value="下面开始实现H5和Kotlin进行通信的学习" >
  <input type="button" value="点击之后调用Kotlin程序" onclick="showKotlin()">

  </body>
</html>

2准备好AndroidStudio的界面布局中的WebView

 <WebView
        android:id="@+id/mWebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

3编写工具类用来处理H5调用逻辑

package com.njupt.kotlinandh5.jsutil

import android.content.Context
import android.webkit.JavascriptInterface
import android.widget.Toast

//来处理 Kotlin与js通信的桥梁类
class JavaScriptMethods {
    private var mContext:Context?=null
    constructor(context:Context){
        this.mContext=context
    }
    //加入一个方法
    @JavascriptInterface
    fun showToast(json:String,){

        mContext?.let{
            Toast.makeText(mContext,json,Toast.LENGTH_SHORT).show()
        }
    }

}

4通过addJavascriptInterface来构建桥梁

package com.njupt.kotlinandh5

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebChromeClient
import android.webkit.WebView
import android.webkit.WebViewClient
import com.njupt.kotlinandh5.jsutil.JavaScriptMethods

class MainActivity : AppCompatActivity() {

    private val myWebView by lazy {
        findViewById<WebView>(R.id.mWebView)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        getUrl()

    }


    private  fun getUrl(){
        //1开启kotlin与H5通信的开关
        myWebView.settings.javaScriptEnabled=true
        myWebView.webViewClient=MyWebViewClient()
        myWebView.webChromeClient=MyWebChromeClient()
        //2当H5与kotlin进行通信时需要使用到通信桥梁类,后面字符串参数表示前面这个参数的对象名
        myWebView.addJavascriptInterface(JavaScriptMethods(this),"jsInterface")
        myWebView.loadUrl("http://10.0.2.2:8080/bmi/")
    }
    private class MyWebViewClient:WebViewClient(){
        //界面加载完成之后会调用这个方法
        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
        }

    }

    private class MyWebChromeClient:WebChromeClient(){
        //加载进度条
        override fun onProgressChanged(view: WebView?, newProgress: Int) {
            super.onProgressChanged(view, newProgress)
        }

    }
}

5结果展示

可以看到点击按钮之后,调用了JavaScriptMethods类中的showToast方法进行显示
在这里插入图片描述
需要注意的是当使用模拟器访问本地网页时,网址变成了10.0.2.2

2在Kotlin中调用H5的程序

1在H5中编写方法,来处理Kotlin的请求

<script>
/*模拟Kotlin来调用H5中的代码,*/
    var kotlinUseH5=function (json) {
      alert(JSON.stringify(json))
    }
  </script>

2在Kotlin中调用方法

inner private class MyWebViewClient:WebViewClient(){
        //界面加载完成之后会调用这个方法
        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
            //第二种通信方式,在kotlin种去访问H5种的方法
            val json=JSONObject()
            json.put("name","这是Kotlin界面传来的数据")
            //调用的例子就是myWebView.loadUrl("javascript:方法名")
            myWebView.loadUrl("javascript:kotlinUseH5("+json.toString()+")")
        }

    }

3结果展示

在这里插入图片描述

3使用CallBack机制来实现H5中发起请求到Kotlin,然后Kotlin去 将响应的结果返回给Kotlin.

在这里插入图片描述

1在H5中编写发起请求和响应请求的函数

<script>
     function callBackM() {
      //1到Kotlin去加载数据
      var json={"callback":"receiveUserData"}
      window.jsInterface.getUserData(JSON.stringify(json))
      //2将返回的数据加载在当前界面

    }
    //用来 获取到返回的数据
    var receiveUserData=function (json) {
      alert(JSON.stringify(json))
    }
    </script>
//按钮为
<input type="button" value="点击之后使用Callback来调用Kotlin程序" onclick="callBackM()">

2编写处理请求的函数

package com.njupt.kotlinandh5.jsutil

import android.content.Context
import android.webkit.JavascriptInterface
import android.webkit.WebView
import android.widget.Toast
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import org.json.JSONObject

//来处理 Kotlin与js通信的桥梁类
class JavaScriptMethods {
    private var mContext:Context?=null
    private var mWebView:WebView?=null
    constructor(context:Context,webView: WebView){
        this.mContext=context
        this.mWebView=webView
    }
    //加入一个方法
    @JavascriptInterface
    fun showToast(json:String,){

        mContext?.let{
            Toast.makeText(mContext,json,Toast.LENGTH_SHORT).show()
        }
    }
    @JavascriptInterface
    //使用callback机制实现调用,为了应对方法名的变化,所以使用key_Value的方式
    fun getUserData(json:String){
        var isJson=JSONObject(json)
        var callback=isJson.optString("callBack")
        //H5调用此方法去获取到数据
        var jsonData=JSONObject()
        jsonData.put("name","花木兰")
        jsonData.put("age","18")
        jsonData.put("address","中国古代")
        //println(jsonData.toString())
        //2将当前请求到的数据返回到H5
        mWebView?.let { it.loadUrl("javascript:"+callback+"("+jsonData.toString()+")")}
    }

}

3主程序中

package com.njupt.kotlinandh5

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebChromeClient
import android.webkit.WebView
import android.webkit.WebViewClient
import com.njupt.kotlinandh5.jsutil.JavaScriptMethods
import org.json.JSONObject

class MainActivity : AppCompatActivity() {

    private val myWebView by lazy {
        findViewById<WebView>(R.id.mWebView)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        getUrl()

    }


    private  fun getUrl(){
        //1开启kotlin与H5通信的开关
        myWebView.settings.javaScriptEnabled=true
        myWebView.webViewClient=MyWebViewClient()
        myWebView.webChromeClient=MyWebChromeClient()
        //2当H5与kotlin进行通信时需要使用到通信桥梁类,后面字符串参数表示前面这个参数的对象名
        //第一种通信方式,在H5中调用Kotlin的代码
        myWebView.addJavascriptInterface(JavaScriptMethods(this,myWebView),"jsInterface")
        myWebView.loadUrl("http://10.0.2.2:8080/bmi/")
    }

    private inner class MyWebViewClient:WebViewClient(){
        //界面加载完成之后会调用这个方法
        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)
            //第二种通信方式,在kotlin种去访问H5种的方法
            var json=JSONObject()
            json.put("name","这是Kotlin界面传来的数据")
            //调用的例子就是myWebView.loadUrl("javascript:方法名")
            myWebView.loadUrl("javascript:kotlinUseH5(" + json.toString() + ")")

        }

    }

    private class MyWebChromeClient:WebChromeClient(){
        //加载进度条
        override fun onProgressChanged(view: WebView?, newProgress: Int) {
            super.onProgressChanged(view, newProgress)
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C】Operator / Expression

系列连载 【python / C / C】 参考 《C语言程序设计&#xff08;第四版&#xff09;谭浩强》【C语言】C语言视频教程《郝斌 C 语言自学教程》 文章目录1 运算符1.1 基本的算术运算符2 表达式1 运算符 1.1 基本的算术运算符 注意&#xff0c; 是右结合的 “” 具有左结合性&…

C++ 面向对象、多继承

// Student.hclass Student { private: // 私有的&#xff0c;外界不能访问char *name;int age;public:void setAge(int age);void setName(char* name);int getAge();char* getName();// 空参构造函数Student(){}// 一参构造函数Student(char* name) : Student(name,80) {// 调…

干翻Hadoop系列:MapReduce详解

第一章&#xff1a;MapReduce原理 数据存储在分布式文件系统中HDFS里边&#xff0c;通过使用Hadoop资源管理系统YARN&#xff0c;Hadoop可以将MapReduce计算&#xff0c;转移到有存储部分的数据的各台机器上。 一&#xff1a;概念和原理 1&#xff1a;MapReduce作业 MapRed…

【机器学习】P16 激活函数 Activation Function

对于激活函数&#xff08;Activation Function&#xff09;&#xff0c;存在两个问题&#xff1a; 为什么要用激活函数&#xff1f;如何选择用哪种激活函数&#xff1f;如何使用激活函数&#xff1f; 本博文将围绕这两个问题&#xff0c;首先介绍激活函数的作用&#xff0c;从…

2023腾讯云轻量应用服务器性能评测

腾讯云轻量应用服务器性能如何&#xff1f;CPU型号主频、内存、公网带宽和系统盘存储多维对比&#xff0c;轻量应用服务器会不会比云服务器CVM性能差&#xff1f;相对于CVM云服务器轻量服务器更适合轻量级的应用&#xff0c;轻量服务适合中小企或个人开发者用于搭建We网站b应用…

利用Python生成和识读二维码(QR Code)和微二维码(Micro QR Code)

目录一、环境准备二、二维码&#xff08;QR Code&#xff09;生成和读取2.1 生成二维码2.2 读取二维码三、微二维码&#xff08;Micro QR Code&#xff09;生成和读取3.1 生成微二维码3.2 读取微二维码之前写的一篇 博客采用了segno库来做微二维码的生成&#xff0c;该库可以方…

AD9689 input clock not detect

在项目调试中&#xff0c;遇到的问题&#xff0c;在ADI论坛上发帖咨询&#xff0c;转发到这里。网址如下&#xff1a; AD9689 input clock not detect - Q&A - High-Speed ADCs - EngineerZone (analog.com) Our FPGA board has two AD9689&#xff0c;one works ok, but…

使用Marshaller 将Java对象转化为XML格式和字符串转为xml

使用Marshaller 将Java对象转化为XML格式 对象转xml内容 ①工具类 public static String convertObjectToXml(Object obj) throws Exception {StringWriter writer new StringWriter();// 创建 JAXBContext 和 MarshallerJAXBContext context JAXBContext.newInstance(obj.ge…

MySQL客观题

MySQL客观题 在数据库的三级模式结构中&#xff0c;描述数据库中全体数据的全局逻辑结构和特性的是&#xff08; A &#xff09; A 模式 B 内模式 C 存储模式 D 外模式 数据库系统的特点是&#xff08; A &#xff09;、数据独立、减少数据冗余、避免数据不一致和加强了数据保…

自定义jar项目上传到Maven中央仓库/maven仓库/阿里云效仓库

1.前言 如何把自己的项目Jar或者Starter上传到Maven中央仓库中。 2.https://issues.sonatype.org/注册账号 3.注册成功 登录新建项目 摘要随意填写 重点来了 groupId 如果有自己域名的就自己域名com.xxx 如果用的gitee那么填写com.gitee.自己gitee的用户名 projectUrl&…

ASEMI代理AD8603AUJZ-REEL7原装ADI车规级AD8603AUJZ-REEL7

编辑&#xff1a;ll ASEMI代理AD8603AUJZ-REEL7原装ADI车规级AD8603AUJZ-REEL7 型号&#xff1a;AD8603AUJZ-REEL7 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;SOT-23-5 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;5 类型&#xff1…

WOT全球技术创新大会2023整装待发,一起去见证科技的力量

从2012年开始&#xff0c;51CTO已经连续11年、累计奉献了19场WOT全球技术创新大会。 11年时间&#xff0c;有的技术如神话般崛起又泡沫般消失&#xff1b;有的技术历经时光磨砺而愈发彰显价值&#xff1b;有的技术充满争议而争议还在继续。 为什么我们会持续策划、举办WOT&am…

Pyspark_用户画像项目_1(数据通过Sqoop导入到Hive中)

Pyspark 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase Hi…

bdydns.com是什么网站?

bdydns.com是网站域名接入百度云CDN后&#xff0c;域名CNAME解析的记录值。网站接入百度云CDN&#xff0c;需要添加CNAME域名解析&#xff0c;例如新手站长网接入百度CDN后&#xff0c;域名CNAME解析到百度CDN地址&#xff1a;www.xinshouzhanzhang.com.a.bdydns.com&#xff0…

DQN算法详解

DQN算法详解 一.概述 强化学习算法可以分为三大类&#xff1a;value based, policy based 和 actor critic。常见的是以DQN为代表的value based算法&#xff0c;这种算法中只有一个值函数网络&#xff0c;没有policy网络&#xff0c;以及以DDPG,TRPO为代表的actor-critic算法…

两层神经网络的参数求导过程

假设输入数据 x∈Rnx\in\mathbb{R}^nx∈Rn&#xff0c;两层神经网络有以下形式&#xff1a; 其中 W1∈RhnW_1\in\mathbb{R}^{h\times n}W1​∈Rhn 和 W2∈RmhW_2\in\mathbb{R}^{m\times h}W2​∈Rmh 分别是第一层和第二层的权重矩阵&#xff0c;b1∈Rhb_1\in\mathbb{R}^hb1​∈…

如何高效地设计测试用例并评审

编写出好的测试用例是每一个测试工程师的职责&#xff0c;但在实际工作中大家写的测试用例往往需要不断地修改才能使用&#xff0c;这不仅浪费了时间&#xff0c;还容易让测试工程师产生自我否定的情绪&#xff0c;甚至在团队中产生各种矛盾。 那如何高效地设计测试用例呢&…

一日一题:第十一题---模拟堆(很认真!)

​作者&#xff1a;小妮无语 专栏&#xff1a;一日一题 &#x1f6b6;‍♀️✌️道阻且长&#xff0c;不要放弃✌️&#x1f3c3;‍♀️ 哭了&#xff0c;一定要记录&#xff0c;为了&#xff0c;写这篇文章千辛万苦 堆笔记 题目描述&#xff1a; 维护一个集合&#xff0c;初始…

javaagent 使用注意

前言 最近做项目&#xff0c;需要实现一个agent&#xff0c;实现运行过程替换字节码&#xff0c;当笔者实现这些功能时发现还是很多注意事项的。而且字节码的替换过程如果类的属性与方法升级了&#xff0c;那么加载就会报错。这种做法的好处是代码无侵入&#xff0c;缺点也很明…

离散化的应用

前言&#xff1a;我们了解离散化的都知道&#xff0c;离散化的本质就是将几个差距很大的数映射成相差较小的数据&#xff0c;同时又保证了数据间的相对大小关系不会发生改变&#xff0c;离散化还是有些争议较大的问题的&#xff0c;比如去重问题等&#xff0c;下面我们就来深入…