关于Android中Java与Javascript之间的传值研究
Android—android与js交互以及相互传参

Android—android与js交互以及相互传参Android中可以通过WebView来实现与js的交互,让⽤户可以在android客户端看到js写的页⾯,接下来为⼤家介绍的就是怎样实现此功能:⾸先android项⽬⽬录下有“assets”⽂件夹,开发者需要将html⽂件拷贝到此⽂件夹下。
html代码:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!-- saved from url=(0032)http://localhost:8080/jsandroid/ --><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="Expires" content="0"><meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Cache-Control" content="no-store,no-cache"><meta name="Handheldfriendly" content="true"><meta name="viewport" content="width=100%; initial-scale=1.0; user-scalable=yes"><meta name="robots" content="all"><meta name="keywords" contect="doodle, mobile, doodlemobile, game, games"><meta name="description" content="Make People's Mobile Life More Connected Through Games."><title>jsandroid_test</title><script type="text/javascript" language="javascript">//此⽅法是调⽤了android的⽅法HtmlcallJava2();function showHtmlcallJava2(){var str = document.getElementById("id_input").valuevar str1 = document.getElementById("id_input2").value//调⽤android中的⽅法window.jsObj.HtmlcallJava2(str+","+str1);}</script></head><body>hello IT-homer<br><br><br><br><input id="id_input" style="width: 90%" type="text" value="null"/><br><br><input id="id_input2" style="width: 90%" type="text" value="null"/><br></body></html>xml布局⽂件,很简单:<LinearLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"tools:context=".JSAndroidActivity"><WebViewandroid:id="@+id/mWebView"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="clickView"android:text="获取"/></LinearLayout>mainActivity中的核⼼代码是:WebSettings webSettings = mWebView.getSettings();webSettings.setJavaScriptEnabled(true);mWebView.addJavascriptInterface(jsInterface, "jsObj");mWebView.loadUrl("file:///android_asset/index.html");请理解核⼼代码的详细注释mainActivity代码:package com.homer.jsandroid;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.StringTokenizer;import android.R.anim;import android.annotation.SuppressLint;import android.app.Activity;import android.content.pm.ActivityInfo;import android.os.Bundle;import android.os.Handler;import android.view.KeyEvent;import android.view.View;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.widget.TextView;import android.widget.Toast;public class JSAndroidActivity extends Activity {private Activity mActivity = null;private WebView mWebView = null;private String message;private JsInterface jsInterface;private String[] params = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mActivity = this;// 锁定横屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(yout.main);params = new String[2];jsInterface = new JsInterface();showWebView();}@SuppressLint("SetJavaScriptEnabled")private void showWebView() {try {mWebView = (WebView) findViewById(R.id.mWebView);mWebView.requestFocus();mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic void onProgressChanged(WebView view, int progress) {JSAndroidActivity.this.setTitle("Loading...");JSAndroidActivity.this.setProgress(progress);if (progress >= 80) {JSAndroidActivity.this.setTitle("JsAndroid Test");}}});mWebView.setOnKeyListener(new View.OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK&& mWebView.canGoBack()) {mWebView.goBack();return true;}return false;}});// WebView的管理设置状态WebSettings webSettings = mWebView.getSettings();// 设置android下容许执⾏js的脚本webSettings.setJavaScriptEnabled(true);// 编码⽅式webSettings.setDefaultTextEncodingName("utf-8");/** 使⽤这个函数将⼀个对象绑定到Javascript,因此可以从Javascript访问的⽅法,* Android(Java)与js(HTML)交互的接⼝函数, jsObj 为桥连对象可随意设值*/mWebView.addJavascriptInterface(jsInterface, "jsObj");/** Android(Java)访问js(HTML)端代码是通过loadUrl函数实现的,访问格式如:* mWebView.loadUrl("javascript: showFromHtml()");*/mWebView.loadUrl("file:///android_asset/index.html");} catch (Exception e) {e.printStackTrace();}}private class JsInterface {/*** js中通过window.jsObj.HtmlcallJava2("参数") 可以调⽤此⽅法并且把js中input中的值作为参数传⼊, * 但这是在点击js中的按钮得到的,若实现点击java中的按钮得到,需要⽅法 clickView(View v)** @param param*/public void HtmlcallJava2(final String param) {message = param;String str = message;StringTokenizer st = new StringTokenizer(str, ",;");while (st.hasMoreTokens()) {for (int i = 0; i < params.length; i++) {params[i] = st.nextToken();System.out.println(params[i]);}}Toast.makeText(JSAndroidActivity.this, param, Toast.LENGTH_SHORT).show();}}/*** button的点击事件** @param v*/public void clickView(View v) {runOnUiThread(new Runnable() {@Overridepublic void run() {/*** 调⽤js中的⽅法实现点击java中的按钮得到js中input的值*/mWebView.loadUrl("javascript: showHtmlcallJava2()");}});}}希望给⼤家带来帮助,谢谢!。
浅谈c++javajavascript之传参

浅谈c++javajavascript之传参本⽂主要梳理了⼏种语⾔的传参机制,即关于传值、传引⽤之争最近开始学node.js搭后端服务器时,碰到这样⼀句话 java只有⼀种传参机制就是传值javascript其⼤部分语法规范取⾃于JAVA语法规范, 那么这种句话也适⽤于它,于是也有 javascript只有⼀种传参机制就是传值为了理解这句话,我从个⼈感觉较为接近底层的语⾔c++写⼀些测试,代码如下#include<iostream>using namespace std;class Test{public:int x;Test(int nx);};Test::Test(int nx){x = nx;}void change(Test *qt){qt->x = 2; Test t(3); qt = &t;}int main(){void change(Test *qt);Test t(1);Test *qt = &t;change(qt);cout<< qt->x <<endl;return1;}执⾏结果为2这⾥,qt是指针,在change函数中指向⼀个新的对象后,为什么结果不是输出3呢?原因是,在这⾥依然是传值,只不过传递是qt的内存地址,该内存地址指向⼀个对象,可以在change函数中改变其对象以期main函数的对象产⽣变化(因为是同个地址指向的同⼀对象),但如果使⽤赋值符号赋⼀个新的对象,传值不会影响到原来的参数接下来,改成传引⽤:void change(Test *&qt){qt->x = 2; Test t(3); qt = &t;}int main(){void change(Test *&qt);Test t(1);Test *qt = &t;change(qt);cout<< qt->x <<endl;return1;}执⾏结果为3这⾥传值和传引⽤都很清楚,那么⽤javascript写⼀段例⼦:function Test(nx){this.x = nx;}function change(t){t.x = 2;t = new Test(3);}var t = new Test(1);change(t);console.log(t.x);执⾏结果为2从执⾏结果来看,这⾥跟c++第⼀个实例很像,可猜测java/javascript内部实现逻辑应该差不多,当传递的是⾮基本类型(如数字,boolean)时,将按值传递其对象的地址(字符串也是对象),⽽之所以说,java/javascript 只有⼀种按值传递这种⽅式,是因为其它⼤部份语⾔如c++/php都提供了⽤&传引⽤的⽅式那么,传引⽤是⼀个什么过程呢?⽐如:int a = 1; int &b = a;此时 b 是 a 的⼀个别名,a和b都是对同⼀内存块的⾼级语⾔的描述标识,在程序执⾏过程中并没有存放,⽽是在编绎过程中将全局变量与程序连接起来,这⾥涉及到编绎原理,暂时没有深究下去。
Android开发中的WebView和JavaScript交互技术(六)

Android开发中的WebView和JavaScript交互技术随着移动互联网的快速发展,越来越多的应用程序需要在移动设备上显示和处理Web页面。
在Android开发中,WebView是一个非常重要的组件,它允许开发者嵌入Web页面,并与JavaScript进行交互。
本文将介绍Android开发中的WebView和JavaScript交互技术,并探讨其应用场景和限制。
一、WebView的基本概念和用途WebView是Android系统提供的一个用于显示嵌入式Web页面的控件。
它具有Web浏览器的功能,可以加载和显示Web页面,同时支持与JavaScript进行交互。
WebView的主要用途包括但不限于以下几个方面:1. 显示静态Web页面:开发者可以通过WebView加载并显示静态的Web页面,如公司官网、新闻资讯等。
用户可以通过滑动、缩放等操作对页面进行浏览,实现与普通浏览器类似的功能。
2. 加载动态Web页面:有些应用程序需要动态加载Web页面并显示数据,如社交媒体客户端或电商应用。
WebView提供了加载URL的方法,开发者可以通过接口调用向服务器请求数据并动态更新页面内容。
3. 进行Web页面的混合开发:WebView允许开发者将原生的Android控件和Web页面进行混合开发,实现更灵活的界面设计和功能扩展。
开发者可以通过内嵌HTML、CSS和JavaScript代码等方式,实现与原生界面无缝集成的效果。
二、WebView和JavaScript的交互方式WebView和JavaScript之间的交互是通过JavaScript接口实现的。
在WebView中,开发者可以通过JavaScriptInterface注解来暴露Java对象的方法给JavaScript调用,实现Java和JavaScript之间的数据交换和方法调用。
WebView提供了两个主要的方法来与JavaScript进行交互:1. WebView的loadUrl方法:开发者可以通过WebView的loadUrl方法调用JavaScript代码,并获取返回值。
android jsbrage原理 -回复

android jsbrage原理-回复Android JavaScript Bridge(Android JSBridge)是一种用于在Android 应用程序中实现JavaScript和Java之间通信的技术。
它提供了一种简单的方法,使JavaScript代码能够调用Android原生代码,以及Android 原生代码能够调用JavaScript函数。
该技术在Web应用程序和混合应用程序中非常常见,它为开发者们提供了更大的灵活性和功能。
一. Android JSBridge的原理Android JSBridge的原理非常简单,它使用了Android的WebView组件来加载包含JavaScript代码的Web页面。
这个Web页面中的JavaScript代码负责调用Android原生方法,并将结果返回给JavaScript。
同时,Android原生代码也可以调用JavaScript函数,以便在需要时更新Web页面。
具体来说,Android JSBridge的原理可以分为以下几个步骤:1. 创建一个WebView组件并加载一个包含JavaScript代码的Web页面。
2. 在Web页面中,通过JavaScript函数调用Android原生方法,并传递参数。
3. Android原生方法接收JavaScript传递的参数,并执行相应的操作。
4. Android原生方法可以通过WebView的evaluateJavascript()函数调用JavaScript函数,并传递结果。
5. JavaScript函数接收Android原生方法的结果,并根据需要更新Web 页面。
二. 实现Android JSBridge的步骤下面,我将逐步介绍如何实现Android JSBridge,以便于理解其原理和实际操作。
步骤一:创建一个WebView组件在Android应用程序的布局文件中添加一个WebView组件,或者通过编程方式创建一个WebView对象。
addjavascriptinterface 原理

addjavascriptinterface 原理在Android开发中,`addJavascriptInterface`方法常常被用来为Web视图(WebView)提供Java对象,使得JavaScript可以直接调用Java代码。
这一功能让网页内容可以与Android应用深度交互,提供更为丰富的用户体验。
然而,由于安全风险和兼容性问题,从Android 4.2开始,`addJavascriptInterface`的默认行为发生了改变。
在此,我们将深入探讨`addJavascriptInterface`的工作原理及其在使用中的注意事项。
一、工作原理`addJavascriptInterface`方法允许你将一个Java对象附加到WebView上,使得JavaScript可以通过这个接口访问Java对象的方法。
这个过程可以简单理解为在JavaScript和Java之间建立了一个桥梁。
当WebView加载的网页通过JavaScript调用这个接口时,实际上是在调用背后的Java对象的方法。
例如,你可以创建一个Java对象,该对象有一个方法用于获取设备信息。
然后,你可以使用`addJavascriptInterface`将这个对象添加到WebView中。
当网页加载时,JavaScript可以通过这个接口调用设备信息方法,获取设备信息。
二、安全风险尽管`addJavascriptInterface`提供了强大的功能,但也存在安全风险。
因为它允许JavaScript直接访问Java对象,如果应用不小心或恶意代码利用了这个特性,可能会导致敏感信息的泄露,甚至执行恶意代码。
特别是当WebView 加载的内容来自不可信的源时,这种风险更为突出。
三、从Android 4.2开始的变化为了增强安全性,从Android 4.2开始,`addJavascriptInterface`的行为发生了变化。
默认情况下,只有标记为可序列化的对象才能通过这个接口暴露给JavaScript。
Android开发中的WebView和JavaScript交互技术(一)

Android开发中的WebView和JavaScript交互技术在现代移动应用的开发中,WebView和JavaScript交互技术发挥着非常重要的作用。
WebView是Android平台中的一个核心组件,它允许开发者将一个网页嵌入到应用中,并且能够与应用的其他组件进行交互。
而JavaScript是前端开发中一门非常流行的脚本语言,通过与WebView的交互,能够实现更加丰富的用户界面和功能。
1. WebView的基本使用和设置在Android中使用WebView非常简单,只需要在XML布局文件中添加一个WebView组件,并在Java代码中加载网页即可。
开发者还可以通过设置WebView的各种属性,来满足不同的需求。
例如,开启JavaScript功能、设置缓存模式、设置代理等。
此外,WebView还提供了丰富的事件回调方法,开发者可以根据需要进行处理。
2. WebView与JavaScript的通信通过WebView与JavaScript的交互,可以实现网页端和原生应用之间的数据传递和方法调用。
在WebView加载网页时,可以通过JavaScript的脚本注入技术,将一些自定义的JavaScript函数注入到网页中。
这些函数可以被网页中的其他脚本调用,以便实现与原生应用的交互。
3. Java代码调用JavaScript函数在WebView中,Java代码可以通过WebView的`loadUrl`方法来调用网页中的JavaScript函数。
通过拼接JavaScript脚本的方式,将函数名称和参数传递给WebView。
例如,`("javascript:myFunction('参数')")`。
这样,在网页中定义的`myFunction`函数将会被调用,并且可以使用传递的参数进行处理。
4. JavaScript调用Java代码除了Java代码调用JavaScript函数外,JavaScript也可以直接调用Java代码中的方法。
android和js交互原理

android和js交互原理
Android和JS交互的原理主要是通过WebView组件来实现。
WebView 组件是Android提供的一个浏览器组件,它可以加载和显示网页,同时也可以通过JavaScriptInterface来实现Android代码和网页中JavaScript代码的交互。
具体来说,当我们在Android应用中使用WebView组件来加载一个网页时,WebView会加载网页中的HTML、CSS和JavaScript代码,并运行这些代码。
如果我们想让Android代码调用网页中的JavaScript代码,或者让JavaScript代码调用Android代码,就可以使用JavaScriptInterface。
JavaScriptInterface是一个Java类,它定义了一些方法,这些方法可以被JavaScript代码调用。
在WebView组件中,我们可以将这个Java类实现为一个对象,并将这个对象与WebView绑定在一起。
这样,网页中的JavaScript代码就可以通过这个对象来调用Android代码了。
同样地,我们也可以在Android代码中调用网页中的JavaScript代码,通过在WebView组件中设置一个特定的URL或者使用WebView的loadUrl方法来执行JavaScript代码。
需要注意的是,为了安全起见,Android系统对网页中的JavaScript代码有一些限制,比如不能访问设备的文件系统、不能执行一些敏感的操作等。
因此,在使用WebView组件进行Android和JS交互时,需要注意安全问题。
Android和JavaScript相互调用的方法

Android和JavaScript相互调⽤的⽅法本⽂实例讲述了Android和JavaScript相互调⽤的⽅法。
分享给⼤家供⼤家参考,具体如下:Html页⾯和Java代码结合的⽅式⼀般⽤在界⾯经常被更改的情况下,可以讲html放在⽹络中,软件⼀打开就会访问⽹络获取到最新的界⾯。
缺点是会受到⽹络信号的影响,从⽽导致访问速度慢。
1.⽤WebView来显⽰HTML代码2.允许WebView执⾏JavaScript复制代码代码如下:webView.getSettings().setJavaScriptEnabled(true);3.获取到HTML⽂件,也可从⽹络中获取复制代码代码如下:webView.loadUrl("file:///android_asset/index.html"); //HTML⽂件存放在assets⽂件夹中4.添加⼀个对象, 让JS可以访问该对象的⽅法, 该对象中也可以调⽤JS中的⽅法复制代码代码如下:webView.addJavascriptInterface(new Contact(), "contact");完整⽰例代码如下:效果图:MainActivityimport android.app.Activity;import android.content.Intent;import .Uri;import android.os.Bundle;import android.webkit.WebView;public class MainActivity extends Activity {private WebView webView;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);//加载页⾯webView = (WebView) findViewById(R.id.webView);//允许JavaScript执⾏webView.getSettings().setJavaScriptEnabled(true);//找到Html⽂件,也可以⽤⽹络上的⽂件webView.loadUrl("file:///android_asset/index.html");// 添加⼀个对象, 让JS可以访问该对象的⽅法, 该对象中可以调⽤JS中的⽅法webView.addJavascriptInterface(new Contact(), "contact");}private final class Contact {//JavaScript调⽤此⽅法拨打电话public void call(String phone) {startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phone)));}//Html调⽤此⽅法传递数据public void showcontacts() {String json = "[{\"name\":\"zxx\", \"amount\":\"9999999\", \"phone\":\"186********\"}]";// 调⽤JS中的⽅法webView.loadUrl("javascript:show('" + json + "')");}}}HTML:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script type="text/javascript">function show(jsondata){var jsonobjs = eval(jsondata);var table = document.getElementById("personTable");for(var y=0; y<jsonobjs.length; y++){var tr = table.insertRow(table.rows.length);var td1 = tr.insertCell(0);var td2 = tr.insertCell(1);td2.align = "center";var td3 = tr.insertCell(2);td3.align = "center";td1.innerHTML = jsonobjs[y].name;td2.innerHTML = jsonobjs[y].amount;td3.innerHTML = "<a href='javascript:contact.call(\""+ jsonobjs[y].phone+ "\")'>"+ jsonobjs[y].phone+ "</a>"; }}</script></head><body onload="javascript:contact.showcontacts()"><table border="0" width="100%" id="personTable" cellspacing="0"><tr><td width="30%">姓名</td><td width="30%" align="center">存款</td><td align="center">电话</td></tr></table></body></html>拨打电话需要添加权限:复制代码代码如下:<uses-permission android:name="android.permission.CALL_PHONE" />希望本⽂所述对⼤家Android程序设计有所帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android中提供的WebView的功能不可谓不强大,并且WebView对于Javascript也能够很好的支持,Google官网也提供了在WebView中如何实现的Java和JavaScript的互相访问。
来看一下源代码:
1 WebViewDemo.java文件:
public class WebViewDemo extends Activity {
private WebView mWebView;
private Handler mHandler = new Handler();
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(yout.webviewdemo);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new Object() {
public void clickOnAndroid() {
mHandler.post(new Runnable() {
public void run() {
mWebView.loadUrl("javascript:wave()");
}
});
}
}, "demo");
mWebView.loadUrl("file:///android_asset/demo.html");
}
}
来分析一下这段代码:
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
首先生成一个WebSettings对象,其次setJavaScriptEnabled(true);通过这句声
明使WebView能够支持JavaScript脚本。
紧接着mWebView.addJavascriptInterface这句,这个方法的原型如下:
addJavascriptInterface(Object obj,String interfaceName),该方法将一个java对象绑定到一个javascript对象中,而这个javascript对象的名字就是第二个参数interfaceName。
这样在WebView进行初始化以后,就可以通过window. interfaceName来访问Java对象了。
这里的interfaceName就是Demo。
第一个参数则是个初始化了一个Java的类,注意这里的clickOnAndroid()方法,这里文档里是这样描述的The Java object that is bound runs in another thread and not in the thread that it was constructed in.
也就是说addJavascriptInterface这里要绑定的类新申请了个进程来处理,这个是需要注意的地方,因此这也是使用了Handler的目的。
mWebView.loadUrl("file:///android_asset/demo.html");这句话是加载了本地的demo.html页面,这个页面是存放在工程的assets下的,为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。
WebView遇到这样的schema,就去当前包中的assets目录中找内容。
如上面的“file:///android_asset/demo.html”
mWebView.loadUrl("javascript:wave()");这句话就是Java调用Javascript的函数了。
这个wave()是在页面中的Javascript脚本中定义的。
下面再来看看在demo.html中是怎样调用的Java函数的,下面是demo.html的代码<html>
<script language="javascript">
function wave() {
document.getElementById("droid").src="android_waving.png";
}
</script>
<body>
<a onClick="window.demo.clickOnAndroid()">
<img id="droid" src="android_normal.png"/><br>
Click me!
</a>
</body>
</html>
其中wave() 是被Java程序调用的。
<a onClick="window.demo.clickOnAndroid()">通过点击来调用window.demo.clickOnAndroid()函数,这样就调用了Java的clickOnAndroid()方法。
这样,通过上面的例子可以看出,实现Java和Javascript之间的交互是比较容易的,下面再来看看如何实现Java和Javascript的传值。
基本上传值的主要思路就是通过函数的参数来进行的,把上面例子进行了修改,将函数加了参数,看修改后如下:
public void clickOnAndroid(final String str)在这个函数添加了一个String 的参数,在HTML里的调用改为如下即可:
window.demo.clickOnAndroid(str)
其中参数str可以在调用以前设置好var str = 1234567890,任意一个值或者是你自己需要得到的页面中的某一个值。
这样就实现了JavaScript向Java传值。
那么Java向JavaScript传值也是采用的函数参数的方式,看一下HTML中的改动:function wave(str)
在Java中也需要做些改动,
mWebView.loadUrl("javascript:wave(‘"+str+"’)");
中间的str是String类型,将需要传给JavaScript的值放入其中。
这样就实现了Java向JavaScript的传值过程。