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.mzph.cn/news/820994.shtml

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

相关文章

项目升级到jdk21后 SpringBoot相关组件的适配

了解到jdk21是一个LTS版本&#xff0c;可以稳定支持协程的功能。经过调研&#xff0c;将目前线上的jdk8升级到21&#xff0c;使用协程提升并发性能。 目前系统使用springBoot 2.0.3.RELEASE&#xff0c;并且引入了mybatis-spring-boot-starter、spring-boot-starter-data-redi…

【电控笔记2.3】速度回路+系统延迟

2.3.1速度回路pi控制器设计 pi伯德图近似设计(不考虑延时理想情况下) Tl:负载转矩 PI控制器的转折频率:Ki/Kp

VScode插件发布

背景 上期在初涉 VS Code 插件开发-CSDN博客中&#xff0c;通过Yeoman工具创建了第一个插件项目&#xff0c;在helloworld的基础上修改&#xff0c;实现预期的功能后&#xff0c;需要将VScode插件发布到插件市场中使用。 官方文档&#xff1a;Publishing Extensions | Visual…

【C语言】带你完全理解指针(六)指针笔试题

目录 1. 2. 3. 4. 5. 6. 7. 8. 1. int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } 【答案】 2&#xff0c;5 【解析】 定义了一个指向整数的指针ptr&#xff0c;并将其初始化为&…

Angular 使用DomSanitizer防范跨站脚本攻击

跨站脚本Cross-site scripting 简称XSS&#xff0c;是代码注入的一种&#xff0c;是一种网站应用程序的安全漏洞攻击。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在使用网页时就会收到影响&#xff0c;这类攻击通常包含了HTML和用户端脚本语言&#xff08;JS&…

微博百度热搜收集

背景 大家都有使用微博、百度吧&#xff0c;而每天的热搜想必大家也用的不少。微博、百度的热搜有7、8种分类&#xff0c;每个单独查看比较耗费时间&#xff0c;效率极低&#xff0c;大概要花费3&#xff0c;4分钟左右。最近闲来无事&#xff0c;冒出个想法&#xff0c;是不是有…

官宣:2024第二十届国际铸造件展12月精彩呈现!

Shanghai International Die-casting Casting Expo 2024第二十届上海国际压铸、铸造展览会 2024第二十届上海国际压铸、铸件产品展 时间&#xff1a;2024年12月18-20日 地点&#xff1a;上海新国际博览中心&#xff08;浦东区龙阳路2345号&#xff09; 报名参展&#xff1…

【Git】初识 Git

文章目录 1. 提出问题2. 如何解决&#xff1f;版本控制器3. 注意事项 1. 提出问题 不知道你工作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种文档时&#xff0c;为了防止文档丢失、更改失误、失误后能恢复到原来的版本&#xff0c;不得不复制出一个副…

CC工具箱使用指南:【浙江省村规结构调整表(杨欢)】

一、简介 群友定制工具。 这个工具的功能简单易懂&#xff0c;就是根据输入的现状用地和规划用地图层&#xff0c;生成浙江村规的结构调整表。 村规的结构调整表格式&#xff0c;各个省份都不太一样&#xff0c;无法做一个通用的工具&#xff0c;实在很让人头痛。 看了之后表…

FactoryMethod工厂方法模式详解

目录 模式定义实现方式简单工厂工厂方法主要优点 应用场景源码中的应用 模式定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。 Factory Method 使得一个类的实例化延迟到子类。 实现方式 简单工厂 以下示例非设计模式&#xff0c;仅为编码的一种规…

libcurl 简单使用

LibCurl是一个开源的免费的多协议数据传输开源库&#xff0c;该框架具备跨平台性&#xff0c;开源免费&#xff0c;并提供了包括HTTP、FTP、SMTP、POP3等协议的功能&#xff0c;使用libcurl可以方便地进行网络数据传输操作&#xff0c;如发送HTTP请求、下载文件、发送电子邮件等…

数据结构DAY4--哈希表

哈希表 概念&#xff1a;相当于字典&#xff0c;可以根据数据的关键字来寻找相关数据的查找表。 步骤&#xff1a;建立->插入->遍历->查找->销毁 建立 建立数据&#xff0c;形式随意&#xff0c;但一般为结构体&#xff08;储存的数据量大&#xff09;&#xff…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅳ)其他配置项

github求⭐ vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#xff09;配置项文档 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;搜索…

OpenHarmony实战开发-如何实现发布图片评论功能。

介绍 本示例将通过发布图片评论场景&#xff0c;介绍如何使用startAbilityForResult接口拉起相机拍照&#xff0c;并获取相机返回的数据。 效果图预览 使用说明 通过startAbilityForResult接口拉起相机&#xff0c;拍照后获取图片地址。 实现思路 1.创建CommentData类&…

进程替换execl

#include<stdio.h> #include<unistd.h> // int execl(const char *path, const char *arg, ...); int main() {printf("start:\n");execl("/usr/bin/ls","ls","-a",NULL);printf("end!\n"); }如果没有exe…

JavaScript 高性能编程 —— 加载和运行

JavaScript 在浏览器中的性能,可认为是开发者所要面对的最重要的可用性问题。此问题因 JavaScript 的阻塞特征而复杂,也就是说,当 JavaScript 运行时其他的事情不能被浏览器处理。 事实上,大多数浏览 器使用单进程处理 UI 更新和 JavaScript 运行等多个任务,而同一时间只能…

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具

文章目录 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具1. 介绍2. 下载3. 静音模式、平衡模式、增强模式配置4. 配置电源方案与模式切换绑定5. 启动Ghelper控制面板6. 目前支持的设备型号 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理…

记录一下我hive连不上DataGrip的问题

用户名和密码都没问题&#xff0c;但报如下这个错误 原因&#xff1a;是因为我在linux上没启hiveserver2服务 解决&#xff1a; [atguiguhadoop102 hadoop]$ hiveserver2 which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8…

Vue3——html-doc-js(html导出为word的js库)

一、下载 官方地址 html-doc-js - npm npm install html-doc-js 二、使用方法 // 使用页面中引入 import exportWord from html-doc-js// 配置项以及实现下载方法 const wrap document.getElementById(test)const config {document:document, //默认当前文档的document…

文件分发软件有哪些?最值得推荐的文件分发软件

文件分发软件有哪些&#xff1f;最值得推荐的文件分发软件 文件分发软件通常用于在企业或个人之间高效、安全地分发大量文件或软件包。文件分发软件在功能、安全、兼容性上各有差异&#xff0c;以下是一些文件分发软件的列举&#xff0c;以及它们的特点或优势&#xff0c;希望…