Kotlin与H5通信的实现方式

这篇具有很好参考价值的文章主要介绍了Kotlin与H5通信的实现方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

运行的端口是http://localhost:8080/bmi/,主要就是一个可以根据人的身高和体重计算出BMI值的小程序还有一个点击之后就可以调用kotlin程序的按钮
Kotlin与H5通信的实现方式其中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方法进行显示
Kotlin与H5通信的实现方式
需要注意的是当使用模拟器访问本地网页时,网址变成了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结果展示

Kotlin与H5通信的实现方式

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

Kotlin与H5通信的实现方式文章来源地址https://www.toymoban.com/news/detail-417009.html

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)
        }

    }
}

到了这里,关于Kotlin与H5通信的实现方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Flutter跨平台插件开发】如何实现kotlin跟C++的相互调用

    在 Kotlin 中,可以使用 JNI (Java Native Interface) 来调用 C++ 代码 调用步骤: 创建 C++ 文件并实现函数。 在 Kotlin 中声明需要调用的 native 函数并加载 native 库。 调用示例 Flutter 插件项目的例子 在 Flutter 插件中引用已有的 C++ 源码需要以下步骤: 首先,在 Flutter 插件的 android 目录下

    2024年01月25日
    浏览(61)
  • Vue中的的通信方式有几种?隔代组件的通信你用那种方式解决?

    props/$emit 适用父子组件通信 ref与parent/children 适用父子组件通信 attrs/listeners,provide/inject 适用于隔代组件通信 vuex,EventBus (事件总线) 适用于父子、隔代、兄弟组件通信 slot 插槽方式 attrs实例 父组件(这时候我们传了两个参数title和type) 子组件(注意:子组件使用了title,那么

    2024年02月14日
    浏览(36)
  • uniapp实现支付宝小程序中嵌入H5并且实现相互通信

    场景:在小程序开发中(无论是支付宝、微信、Uniapp等)会遇到在小程序中使用或者跳转一些自己的公司开发过的,或三方地址,在小程序中的开发文档中大家可以看到,只是有一些基本的内部跳转方式,但通过仅有的跳转方式无法满足我们的跳转外部页面的需求,这个时候

    2024年01月19日
    浏览(40)
  • h5端调用手机摄像头实现扫一扫功能

     一、前言         最近有遇到一个需求,在h5浏览器中实现扫码功能,其本质便是打开手机摄像头定时拍照,特此做一个记录。主要技术栈采用的是vue2,使用的开发工具是hbuilderX。         经过测试发现部分浏览器并不支持打开摄像头,测试了果子,华子和米,发现

    2024年03月14日
    浏览(85)
  • 【spring Cloud】微服务通信的三种方式RestTemplate、Feign远程调用与Dubbo的使用

    目录 一、通过RestTemplate调用微服务 二、通过Feign远程调用 三、Dubbo  分布式中的远程调用大概分为两种 RESTful接口  REST,即Representational State Transfer的缩写,如果一个架构符合REST原则,就称它为RESTful架构。 每一个URI代表一种资源; 客户端和服务器之间,传递这种资源的某种

    2024年04月11日
    浏览(45)
  • Frida主动调用java函数来爆破解题思路

    利用Frida去调用java代码中的类,然后爆破。算是一种主动调用的方法。主动调用可以用于爆破,模拟程序部分执行,需要注意的知识点是在java代码中的static类型数据在爆破过程中需要每次都对这种类型值重新设置。因为static类型在所有实例中都是统一,修改一个实例就会修改

    2024年02月13日
    浏览(72)
  • Java-WebSocket通信 实现根据查询条件主动实时回传数据给前端&List<Map<String, Object>>转JSON编码器&WebSocket无法注册Bean问题解决方案

    项目背景:Java环境,Get请求根据前端查询条件建立WebSocket连接,每5秒主动实时推送最新查询结果给前端展示。其中也遇到定时器、WebSocket无法注册Bean、No encoder specified for object of class [class java.util.xxx]等问题,相关解决方案也有列举~ Web Sockets 的是在一个单独的持久连接上提

    2024年02月04日
    浏览(48)
  • uniapp实现条码扫描 可开闪光灯,原生H5调用,不需要任何sdk。

    使用QuaggaJs这个库。调用摄像头使用的 navigator.mediaDevices.getUserMedia 这个H5的api。通过 video 和 canvas 把摄像头获取到的数据展现到页面上,同时调用监听Quagga解析。 获取设备摄像头权限,用于后续开启摄像头。 创建video元素显示摄像头画面,和canvas元素用于QuaggaJS进行图像处理和解

    2024年02月06日
    浏览(53)
  • Android Studio App开发之网络通信中使用GET方式调用HTTP接口的讲解及实战(附源码 超详细必看)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ Android开发采用Java作为编程语言,也就沿用了Java的HTTP连接工具HttpURLConnection,不管是访问HTTP接口还是上传或下载文件都是用它来实现。它有几个关键点 1:HttpURLConnection默认采取国际通行的UTF-8编码,中文用GBK编码 2:多数

    2024年02月05日
    浏览(109)
  • Vue H5项目,怎么引入uni.webview sdk,调用uni postMessage实现手机蓝牙连接打印功能(uniapp)

    目前公司Vue H5项目,用webview打包成APP,现产品提出这样打包出来的app运行较慢,需要用uniapp方式(即使用HBuilder编辑器来打包H5)来打包,那需要的基座就不是安卓的基座而是uniapp的基座,而H5项目实现手机扫描功能就需要调用uniapp的基座的方法。 Vue2 开发的移动端项目(H5项

    2024年02月20日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包