我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android与Vue借助WebView双向通信

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android与Vue借助WebView双向通信

Android 与 Vue 双向通信

原生与vue交互其实就是和js交互,方法相同

本来想要使用DSBridge进行通信,但这个作者好像不维护了,引用不了这个库,索性直接使用webview的方法

下面是两个demo的总结,混合开发一般都是vue调用原生方法的情况多。

交互准备

1、vue准备

Android调用js方法!{{ name }}

点我调用Android方法
data() {    return {      name: "i am js",    };  },  methods: {    // Android调用js方法    callJsFunction(str) {      this.name = str;      return "js调用成功";    },    // js调用Android方法    showAndroidToast() {      $Android.showToast("哈哈,我是js调用的");    },  },  mounted() {    //将要给原生调用的方法挂载到 window 上面,方便原生直接调用    window.callJsFunction = this.callJsFunction;  },
开启项目,两种方式
  1. npm run serve 运行项目,得到局域网地址:http://10.253.27.224:8080(每个人地址不同,Android与vue项目需在同一个局域网下)

  2. npm run build直接打包项目到dist文件夹,随后将dist文件夹里的内容复制到Android项目里(注意:这里的assets文件夹不是directory,而是带有安卓图标的Folder,后面引入需要用到

请添加图片描述

2、Android准备

activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity">        <WebView        android:id="@+id/webview"        android:layout_width="match_parent"        android:layout_height="match_parent"/>    LinearLayout>
AndroidManifest.xml

添加用户许可

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
使用明文网络流量
<application        android:allowBackup="true"        ...        android:usesCleartextTraffic="true">...    application>
MainActivity 中的onCreate里
setContentView(R.layout.activity_main);        super.onCreate(savedInstanceState);//引入页面setContentView(R.layout.activity_main);//webview设置        WebView webview = findViewById(R.id.webview)        WebSettings webSettings = webview.getSettings();        webSettings.setDomStorageEnabled(true);        webSettings.setJavaScriptEnabled(true);        webSettings.setBlockNetworkImage(false);        // 覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开        webview.setWebViewClient(new WebViewClient() {            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {//                view.loadUrl(url);//                return true;                if (url.startsWith("http:") || url.startsWith("https:") || url.startsWith("ftp")) {                    view.loadUrl(url);                    return true;                } else if (url.startsWith("scheme://")) {                    // 使用浏览器打开                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));                    startActivity(intent);                    return true;                } else {                    return false;                }            }                    //dist打包方式引入  //      webview.loadUrl("file:///android_asset/index.html");        //局域网方式引入          webview.loadUrl("http://10.253.27.224:8080");
至此,就可以实现Android项目引入vue页面了。

请添加图片描述


一、Android 调用 Vue 方法

  • 原生调用vue方法比较简单,上面准备工作已经在vue中将其方法暴露在window中,只需要在Android中触发调用即可,也可以绑定在安卓按钮中,这里不进行展示。
  • 通过evaluateJavascript()实现
在vue页面加载后进行调用
// webview.setWebViewClient(new WebViewClient() {}里面@Overridepublic void onPageFinished(WebView webView, String s) {    super.onPageFinished(webView, s);    // 在 onPageFinished 回调里调用,表示页面加载好就调用    webview.post(new Runnable() {        @Override        public void run() {            webview.evaluateJavascript("javascript:callJsFunction('hello js')", new ValueCallback<String>() {                @Override                public void onReceiveValue(String s) {                    Log.d("MainActivity","js返回的结果: " + s); //日志打印                }            });        }    });}
运行app

可以看到日志打印了出来,调用了vue中的函数,而且也通过函数改变了name的值,变成hello js

请添加图片描述
请添加图片描述


二、Vue 调用 原生方法

vue调用原生的方法就稍微比较麻烦,我们要实现在vue页面中点击按钮或者文字,然后调用原生的toast弹框。

1、创建JsJavaBridge类

下面的ToastUtil为封装好的,可以用系统自带的库

public class JsJavaBridge {    //同步API    @JavascriptInterface    public String testSyn(Object msg)  {        return msg + "[syn call]";    }    private Activity activity;    private WebView webView;    public JsJavaBridge(Activity activity, WebView webView) {        this.activity = activity;        this.webView = webView;    }    @JavascriptInterface    public void onFinishActivity() {        activity.finish();    }    @JavascriptInterface    public void showToast(String msg) {        ToastUtil.showToast(msg);    }}

2、通过 WebView 设置 Android 类与 JS 代码的映射

webview.addJavascriptInterface(new JsJavaBridge(this, webview), "$Android");

这里将类 JsJavaBridge 在 JS 中映射为了 $Android,所以在 Vue 中可以这样调用 $Android.showToast("哈哈,我是js调用的")

请添加图片描述

想要了解更多的话可以参考这篇文章

Carson带你学Android:全面总结WebView与 JS 的交互方式

来源地址:https://blog.csdn.net/weixin_62350313/article/details/129664743

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android与Vue借助WebView双向通信

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android与Vue借助WebView双向通信

Android 与 Vue 双向通信 原生与vue交互其实就是和js交互,方法相同 本来想要使用DSBridge进行通信,但这个作者好像不维护了,引用不了这个库,索性直接使用webview的方法 下面是两个demo的总结,混合开发一
2023-08-30

ReactNative中WebView与html双向通信遇到的坑

这篇文章主要介绍了ReactNative中WebView与html双向通信的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-01-29

Android Socket 线程连接openwrt与arduino单片机串口双向通信的实例解析

废话不多说了,直接给大家贴代码了,具体代码如下所示:package zcd.netanything; import java.io.BufferedReader; import java.io.InputStreamReader; impo
2022-06-06

[Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(一)——服务端

前言 需求是这样的,system_server有一个LocalService,需要向一个具有root权限的native进程进行消息传递(下发请求指令,获取状态信息等)评估 首先附上官方介绍:https://source.android.co
2022-06-06

[Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(二)——踩坑篇

前言 在上一篇中,我们已经搭建好了服务端的代码结构,并且保证编译通过; 但是由于各种坑的存在,我们无法直接让服务端跑起来,因此本篇不是写客户端调用,而是一篇和编译规则定义、selinux规则添加等相关的踩坑总集,如果你已经保证服务端已经跑起
2022-06-06

[Android][frameworks][HIDL]使用HIDL新建虚拟HAL以实现system_server与native进程双向通信(三)——JAVA客户端

前言 在上一篇中已经完成了服务端的集成,手机软件此时已经可以自动启动服务端,且运行无异常。 接下来我们就要实现我们的终极目标了:system_server(JAVA端)与服务端相互通信; 预处理 首先先解释下一个“玄学”的情况:在前两章的操
2022-06-06

编程热搜

目录