android客户端和服务端js交互

简介:  挺帅的移动开发专栏  http://blog.csdn.net/wangtingshuai/article/details/8631835       在android的开发过程中,有很多时候需要用到本地java代码和javascript进行交互。android对交互进行了很好的封装,在开发中我们可以很简单的用java代码调用webview中的js,也可以用webview中的js

挺帅的移动开发专栏   http://blog.csdn.net/wangtingshuai/article/details/8631835
       在android的开发过程中,有很多时候需要用到本地java代码和javascript进行交互。android对交互进行了很好的封装, 在开发中我们可以很简单的用java代码调用webview中的js,也可以用webview中的js来调用本地的java代码, 这样我们可以实现很多原来做不了的功能,比如点击网页上的电话号码后,手机自动拨打电话,点击网页中的笑话,自动发送短信等.

废话不多说,这次教程的目标如下
  1. android 中的java代码调用webview里面的js脚本
  2. webview中的js脚本调用本地的java代码
  3. java调用js并传递参数
  4. js调用java并传递参数
功能一

android中调用webview中的js脚本非常方便,只需要调用webview的loadUrl方法即可( 注意开启js支持

  1. // 启用javascript  
  2. contentWebView.getSettings().setJavaScriptEnabled(true);  
  3. // 从assets目录下面的加载html  
  4. contentWebView.loadUrl("file:///android_asset/wst.html");  
  5.   
  6.               // 无参数调用  
  7.        contentWebView.loadUrl("javascript:javacalljs()");  
		// 启用javascript
		contentWebView.getSettings().setJavaScriptEnabled(true);
		// 从assets目录下面的加载html
		contentWebView.loadUrl("file:///android_asset/wst.html");

                // 无参数调用
	        contentWebView.loadUrl("javascript:javacalljs()");

功能二
webview中js调用本地java方法,这个功能实现起来稍微有点麻烦,不过也不怎么复杂, 首先要对webview绑定javascriptInterface,js脚本通过这个接口来调用java代码。
  1. contentWebView.addJavascriptInterface(this"wst");  
		contentWebView.addJavascriptInterface(this, "wst");
javainterface实际就是一个普通的java类,里面是我们本地实现的java代码, 将object 传递给webview,并指定别名,这样js脚本就可以通过我们给的这个别名来调用我们的方法,在上面的代码中, this是实例化的对象,wst是这个对象在js中的别名

功能三
java代码调用js并传递参数
只需要在待用js函数的时候加入参数即可,下面是传递一个参数的情况,需要多个参数的时候自己拼接及行了,注意str类型在传递的时候参数要用单引号括起来

  1. mWebView.loadUrl("javascript:test('" + aa+ "')"); //aa是js的函数test()的参数  
mWebView.loadUrl("javascript:test('" + aa+ "')"); //aa是js的函数test()的参数
功能四
js调用java函数并传参,java函数正常书写,在js脚本中调用的时候稍加注意
然后在html页面中,利用如下代码,即可实现调用
  1. <div id='b'><a onclick="window.wst.clickOnAndroid(2)">b.c</a></div>  
<div id='b'><a onclick="window.wst.clickOnAndroid(2)">b.c</a></div>

这里准备了一个实例,实现上面的功能

这里是实例的html代码,从assert中加载,原来做项目的时候,从assert中加载的中文网页会出现乱码,解决办法就是给html指定编码。如下


  1. <html>  
  2. <head>  
  3. <meta http-equiv="Content-Type"  content="text/html;charset=gb2312">  
  4. <script type="text/javascript">  
  5. function javacalljs(){  
  6.      document.getElementById("content").innerHTML +=     
  7.          "<br\>java调用了js函数";  
  8. }  
  9.   
  10. function javacalljswithargs(arg){  
  11.      document.getElementById("content").innerHTML +=     
  12.          ("<br\>"+arg);  
  13. }  
  14.   
  15. </script>  
  16. </head>  
  17. <body>  
  18. this is my html <br/>  
  19. <a onClick="window.wst.startFunction()">点击调用java代码</a><br/>  
  20. <a onClick="window.wst.startFunction('hello world')" >点击调用java代码并传递参数</a>  
  21. <br/>  
  22. <div id="content">内容显示</div>  
  23. </body>  
  24. </html>  
<html>
<head>
<meta http-equiv="Content-Type"	content="text/html;charset=gb2312">
<script type="text/javascript">
function javacalljs(){
	 document.getElementById("content").innerHTML +=   
         "<br\>java调用了js函数";
}

function javacalljswithargs(arg){
	 document.getElementById("content").innerHTML +=   
         ("<br\>"+arg);
}

</script>
</head>
<body>
this is my html <br/>
<a onClick="window.wst.startFunction()">点击调用java代码</a><br/>
<a onClick="window.wst.startFunction('hello world')" >点击调用java代码并传递参数</a>
<br/>
<div id="content">内容显示</div>
</body>
</html>

java代码 如下

  1. package wst.webview;  
  2.   
  3. import android.annotation.SuppressLint;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.webkit.WebView;  
  9. import android.widget.Button;  
  10. import android.widget.TextView;  
  11. import android.widget.Toast;  
  12.   
  13. public class MainActivity extends Activity {  
  14.   
  15.     private WebView contentWebView = null;  
  16.     private TextView msgView = null;  
  17.   
  18.     @SuppressLint("SetJavaScriptEnabled")  
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.main);  
  23.         contentWebView = (WebView) findViewById(R.id.webview);  
  24.         msgView = (TextView) findViewById(R.id.msg);  
  25.         // 启用javascript  
  26.         contentWebView.getSettings().setJavaScriptEnabled(true);  
  27.         // 从assets目录下面的加载html  
  28.         contentWebView.loadUrl("file:///android_asset/wst.html");  
  29.   
  30.         Button button = (Button) findViewById(R.id.button);  
  31.         button.setOnClickListener(btnClickListener);  
  32.         contentWebView.addJavascriptInterface(this"wst");  
  33.     }  
  34.   
  35.     OnClickListener btnClickListener = new Button.OnClickListener() {  
  36.         public void onClick(View v) {  
  37.             // 无参数调用  
  38.             contentWebView.loadUrl("javascript:javacalljs()");  
  39.             // 传递参数调用  
  40.             contentWebView.loadUrl("javascript:javacalljswithargs(" + "'hello world'" + ")");  
  41.         }  
  42.     };  
  43.   
  44.     public void startFunction() {  
  45.         Toast.makeText(this"js调用了java函数", Toast.LENGTH_SHORT).show();  
  46.         runOnUiThread(new Runnable() {  
  47.   
  48.             @Override  
  49.             public void run() {  
  50.                 msgView.setText(msgView.getText() + "\njs调用了java函数");  
  51.   
  52.             }  
  53.         });  
  54.     }  
  55.   
  56.     public void startFunction(final String str) {  
  57.         Toast.makeText(this, str, Toast.LENGTH_SHORT).show();  
  58.         runOnUiThread(new Runnable() {  
  59.   
  60.             @Override  
  61.             public void run() {  
  62.                 msgView.setText(msgView.getText() + "\njs调用了java函数传递参数:" + str);  
  63.   
  64.             }  
  65.         });  
  66.     }  
  67. }  
package wst.webview;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private WebView contentWebView = null;
	private TextView msgView = null;

	@SuppressLint("SetJavaScriptEnabled")
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		contentWebView = (WebView) findViewById(R.id.webview);
		msgView = (TextView) findViewById(R.id.msg);
		// 启用javascript
		contentWebView.getSettings().setJavaScriptEnabled(true);
		// 从assets目录下面的加载html
		contentWebView.loadUrl("file:///android_asset/wst.html");

		Button button = (Button) findViewById(R.id.button);
		button.setOnClickListener(btnClickListener);
		contentWebView.addJavascriptInterface(this, "wst");
	}

	OnClickListener btnClickListener = new Button.OnClickListener() {
		public void onClick(View v) {
			// 无参数调用
			contentWebView.loadUrl("javascript:javacalljs()");
			// 传递参数调用
			contentWebView.loadUrl("javascript:javacalljswithargs(" + "'hello world'" + ")");
		}
	};

	public void startFunction() {
		Toast.makeText(this, "js调用了java函数", Toast.LENGTH_SHORT).show();
		runOnUiThread(new Runnable() {

			@Override
			public void run() {
				msgView.setText(msgView.getText() + "\njs调用了java函数");

			}
		});
	}

	public void startFunction(final String str) {
		Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
		runOnUiThread(new Runnable() {

			@Override
			public void run() {
				msgView.setText(msgView.getText() + "\njs调用了java函数传递参数:" + str);

			}
		});
	}
}

布局文件

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <WebView  
  8.         android:id="@+id/webview"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:layout_weight="9" />  
  12.   
  13.     <ScrollView  
  14.         android:id="@+id/scrollView1"  
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="wrap_content" >  
  17.   
  18.         <TextView  
  19.             android:id="@+id/msg"  
  20.             android:layout_width="fill_parent"  
  21.             android:layout_height="fill_parent"  
  22.             android:text="text" />  
  23.     </ScrollView>  
  24.   
  25.     <Button  
  26.         android:id="@+id/button"  
  27.         android:layout_width="fill_parent"  
  28.         android:layout_height="wrap_content"  
  29.         android:layout_weight="1"  
  30.         android:text="java调用js函数" />  
  31.   
  32. </LinearLayout>  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="9" />

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/msg"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="text" />
    </ScrollView>

    <Button
        android:id="@+id/button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="java调用js函数" />

</LinearLayout>

希望对大家有所帮助
资源下载地址
目录
相关文章
|
11天前
android-agent-web中js-bridge案例
android-agent-web中js-bridge案例
17 2
|
19天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
11 0
|
19天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
11 0
|
2月前
|
移动开发 JavaScript Android开发
Android与Html5交互
Android与Html5交互
|
2月前
|
JavaScript 前端开发 Java
如何使用内网穿透实现远程公网访问windows node.js的服务端
如何使用内网穿透实现远程公网访问windows node.js的服务端
|
3月前
|
JSON JavaScript 前端开发
JS服务端技术—Node.js知识点
本篇文章是我开始系统学习Node.js的一些笔记。如果文中阐述不全或不对的,多多交流。
62 0
JS服务端技术—Node.js知识点
|
3月前
|
XML Android开发 数据格式
安卓和webview交互
安卓和webview交互
26 0
|
3月前
|
JavaScript 前端开发 网络协议
轻松搭建远程Node.js服务端,让你的应用在公共网络中畅行无阻!
Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation(原为 Node.js Foundation,已与 JS Foundation 合并)持有和维护,亦为 Linux 基金会的项目。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高性能,可优化应用程序的传输量和规模。这些技术通常用于资料密集的即时应用程序。
|
3月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
28 0
|
4月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)(下)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
26 0