APP开发_Android 与 js 互相调用

1 js 调用 Android 方法

当使用 JavaScript 调用 Android 原生方法时,主要涉及到 Android 的 WebView 组件,它允许你在 Android 应用中嵌入网页内容,并提供了 JavaScript 与 Android 代码交互的能力。

(1)创建JavaScriptInterface类

首先,需要创建一个Java类,实现 WebView.JavascriptInterface 接口。这个类将作为 JavaScript 和 Android 原生代码之间的桥梁。

import android.content.Context;
import android.webkit.JavascriptInterface;
import android.widget.Toast;public class WebAppInterface {Context mContext;/** Instantiate the interface and set the context */WebAppInterface(Context c) {mContext = c;}/** Show a toast from the web page */@JavascriptInterfacepublic void showToast(String toast) {Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();}
}

注意,@JavascriptInterface 注解是必须的,该注解允许 Android 识别哪些方法可以被 JavaScript 调用。

(2)在WebView中启用JavaScript并添加接口

然后,在 Activity 或 Fragment 中,需要初始化 WebView,启用 JavaScript,并将创建的 JavaScriptInterface 实例添加到 WebView 中。

import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private WebView webView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);webView = findViewById(R.id.webview);webView.getSettings().setJavaScriptEnabled(true);webView.addJavascriptInterface(new WebAppInterface(this), "Android");webView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;}});// 加载一个HTML页面,或者直接使用webView.loadDataWithBaseURL()加载包含JavaScript的字符串webView.loadUrl("file:///android_asset/my_page.html");}
}

这里,addJavascriptInterface 方法的第一个参数是 JavaScriptInterface 的实例,第二个参数是 JavaScript 中用来访问这个接口的对象名(这里使用了 “Android”)。

(3)在 HTML 中调用 Android 方法

在 HTML 页面中,即可以使用 JavaScript 来调用 Android 方法。

<!DOCTYPE html>
<html>
<head><title>WebView JavaScript Interface Example</title><script type="text/javascript">function callAndroidFunction() {// 调用Android方法Android.showToast("Hello from JavaScript!");}</script>
</head>
<body><h1>WebView JavaScript Interface Example</h1><button onclick="callAndroidFunction()">Call Android Function</button>
</body>
</html>

在这里插入图片描述

在这个例子中,当用户点击按钮时, callAndroidFunction 函数会被调用,它使用 Android 端定义的 showToast 方法。

(4)处理返回值(如果必要)

如果需要从 Android 方法获取返回值并在 JavaScript 中使用它,则需要稍微修改你的方法,使其返回一个可以被 JavaScript 识别的值。这通常涉及到使用基本数据类型(如字符串、数字、布尔值)或 JSON 对象(实际上也是一个字符串)。

@JavascriptInterface
public String getSomeData() {// 假设你有一个方法来获取一些数据String data = "Some data";return data;
}

在 JavaScript 中,可以这样调用它:

function fetchAndroidData() {var data = Android.getSomeData();console.log(data); // 输出 "Some data"
}

(5)注意事项

  • 不要暴露敏感功能:只暴露那些确实需要从 JavaScript 调用的功能。避免暴露可能导致应用崩溃、数据泄露或执行敏感操作的方法。
  • 考虑性能和用户体验:频繁地在 JavaScript 和 Android 之间传递大量数据可能会影响应用的性能。因此需要确保只传递必要的数据,并尽量减少调用次数。

2 Android 调用 js 方法

(1)启用 WebView 的 JavaScript 支持

首先,需要在 WebView 设置中启用 JavaScript 支持。这可以通过调用 WebSettings 对象的 setJavaScriptEnabled(true) 方法来实现。

WebView webView = findViewById(R.id.webview);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);

(2)加载HTML内容或网页

接下来,需要加载包含 JavaScript 代码的 HTML 内容或网页到 WebView 中。这可以通过调用 loadUrl 或 loadData 方法实现。

webView.loadUrl("https://example.com"); // 加载网页
// 或者
String htmlContent = "<html><body><h1>Hello World!</h1><script>function showAlert() { alert('Hello from JavaScript'); }</script></body></html>";
webView.loadDataWithBaseURL(null, htmlContent, "text/html", "UTF-8", null); // 加载HTML内容

(3)调用JavaScript代码

一旦 WebView 加载了内容,就可以使用 evaluateJavascript 方法来执行 JavaScript 代码。这个方法接受一个 JavaScript 字符串作为参数,并可以接收一个回调来处理 JavaScript 执行后的结果。

webView.evaluateJavascript("javascript:(function() { return document.title; })()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {// 在这里处理JavaScript返回的值Log.d("WebView", "Page title: " + value);}
});

在上面的例子中,我们执行了一个匿名函数,它返回当前文档的标题,并通过 ValueCallback 回调接收这个值。

(3)处理异步 JavaScript 执行

如果需要执行的 JavaScript 代码是异步的(例如,它依赖于某个事件或回调),那么一定要确保 Android 代码能够等待 JavaScript 代码执行完成。可以 JavaScript 代码中设置一个全局变量或使用某种形式的通信机制(如 postMessage 到 iframe)。

(4)注意要与 WebView 的生命周期同步

确保 JavaScript 调用与 WebView 的生命周期同步。当 WebView 被销毁或不可用时,就不可以再执行 JavaScript 代码。可以通过监听 WebView 的生命周期事件(如 onPause 和 onResume)来管理这一点。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盲人安全导航技巧:科技赋能让出行更自如

作为一名资深记者&#xff0c;长期关注并报道无障碍领域的发展动态。今日&#xff0c;我将聚焦盲人安全导航技巧&#xff0c;探讨这一主题下科技如何赋能视障人士实现更为安全、独立的出行。一款融合了实时避障、拍照识别物体及场景功能的盲人出行辅助应用叫做蝙蝠避障&#xf…

OpenHarmony实战开发-Grid和List内拖拽交换子组件位置。

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

Map与Set的模拟实现封装

目录 一. 底层原理 二. 红黑树节点的定义 三. 仿函数封装 四. 基本函数的封装 五. 迭代器的封装 5.1 迭代器的基本定义 5.2 *与->操作 5.3 迭代器的操作 5.3.1 右子树不为空 5.3.2 右子树为空 5.4 迭代器的--操作 5.4.1 当前节点的父节点…

[Java EE] 多线程(一) :线程的创建与常用方法(上)

1. 认识线程 1.1 概念 1.1.1 什么是线程 ⼀个线程就是⼀个"执⾏流".每个线程之间都可以按照顺序执⾏⾃⼰的代码.多个线程之间"同时"执⾏ 着多份代码. 还是回到我们之前的银⾏的例⼦中。之前我们主要描述的是个⼈业务&#xff0c;即⼀个⼈完全处理⾃⼰的…

WPS的JS宏如何实现全文件路径字符串中截取文件名(excel)

从全文件路径的字符串中&#xff0c;截取文件名称&#xff0c;例如&#xff1a; 全文件路径字符串为&#xff1a;C:\Windows\System32\drivers\acpi1.sys 需要截取文件名&#xff1a;acpi1.sys 方法如下&#xff1a; 1、简单的方式&#xff1a;把全文件路径字符串拷贝&…

Python 物联网入门指南(七)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第二十四章&#xff1a;基本开关 到目前为止一定是一段史诗般的旅程&#xff01;回想一下你开始阅读这本书的时候&#xff0c;你是否曾想象…

大创项目推荐 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

逆向案例二十二——同样是webpack

网址&#xff1a;aHR0cHM6Ly93d3cubXl0b2tlbmNhcC5jb20vemgv 嘿嘿&#xff0c;我也是用上加密了&#xff0c;简单base64加密&#xff0c;用在线网站解密即可。 抓包发现code是形似加密的&#xff0c;换一个包&#xff0c;观察它是否有变化&#xff0c;发现确实是有变化&#…

word文件的创建时间和修改时间可以更改吗?答案是肯定的 文件属性修改的方法

一&#xff0c;引言 在日常生活和工作中&#xff0c;我们经常需要处理各种Word文件。有时&#xff0c;由于某些原因&#xff0c;我们可能需要更改Word文件的创建时间和修改时间。虽然这听起来可能有些复杂&#xff0c;但实际上&#xff0c;通过一些简单的方法和工具&#xff0…

Jenkins打包app并通过openssh上传到服务器

1、下载安装openssh 网上很多教程&#xff0c;包括开端口的&#xff0c;可以搜下 2、配置openssh根目录 进入C:\ProgramData\ssh打开文件sshd_config&#xff0c;添加配置ChrootDirectory D:\wxs\soft&#xff0c;想改端口的也在这个文件 3、安装Jenkins 参考上一篇 4、新…

人工智能与IP代理池:解析网络数据采集的未来

前言 随着互联网的快速发展&#xff0c;数据成为了当今社会最宝贵的资源之一。然而&#xff0c;要获取大量的网络数据并进行有效的分析&#xff0c;往往需要面对诸多挑战&#xff0c;其中之一就是网络封锁与反爬虫机制。在这个背景下&#xff0c;人工智能&#xff08;AI&#x…

HTML中div/span标签、音频标签、视频标签与特殊字符

目录 div/span标签 音频标签 视频标签 特殊字符 div/span标签 在HTML中&#xff0c;<div></div>和<span></span>是没有语义的&#xff0c;可以将两个标签当做两个盒子&#xff0c;里面可以容纳内容 两个标签有以下两个特点&#xff1a; 1. <…