android和javascript之间相互通信实例分析
1. AndroidManifest.xml中必须使用许可 "android.permission.INTERNET", 否则会出Web page not available错误。
<uses-permission android:name="android.permission.INTERNET"/>
2. 如果访问的页面中有Javascript,则webview必须设置支持Javascript。
1 WebSettings webSetting = webview.getSettings();
2 webSetting.setJavaScriptEnabled(true);
3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象或者覆盖webview的 setWebChromeClient
1 mWebView.setWebViewClient(new WebViewClient(){
2 public boolean shouldOverrideUrlLoading(WebView view, String url) {
3 view.loadUrl(url);
4 return true;
5 }
6 });

1 mWebView.setWebChromeClient(new MyWebChromeClient()
2 @Override
3 public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
4 Log.d(LOG_TAG, message);
5 result.confirm();
6 return true;
7 });

4. 如果不做任何处理,浏览网页,安卓源码点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。

1 public boolean onKeyDown(int keyCode, KeyEvent event) {
2 if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
3 mWebView.goBack();
4 return true;
5 }
6 return super.onKeyDown(keyCode, event);
7 }

5. javascript对象 与 android 对象绑定
WebView注入Java对象
对象注入即通过webview 建立 javascript对象 与 android 原生对象的绑定关系,下面代码中,obj1对象在android程序中可以操作,obj2在js程序中可以操作,两者操作的均为同一个内存对象,即可以理解为,两个绑定的对象是同一个对象在不同运行环境下的一个别名(仅个人理解,有误请大牛指正)
1 webview.getSetting().setJavaScriptEnable(true);
2 class JsObject {
3 @JavascriptInterface
4 public String toString() { return "injectedObject"; }
5 }
6 webView.addJavascriptInterface(new JsObject()obj1, "injectedObject"obj2);
上面的程序建立 javascript 与android 程序的绑定关系,android 4.2 之后版本提供给js调用的函数必须带有注释语句@JavascriptInterface ,4.2版本之前向webview注入的对象所暴露的接口不是必须带有@JavascriptInterface注释语句(需要注意,android adt,eclipse生成的工程,低版本中会自动带有 anotations.jar,支持@JavascriptInterface, 而高版本中工程中,不会自动带有anotations.jar包,所以要加入注释语句@JavascriptInterface,首先要自己手动加入anotations.jar包,不要忘记import 哦!本人就犯过这么低级的错误哦)
官方文档解释是因为这个接口允许JavaScript 控制宿主应用程序,这是个很强大的特性,但同时,在4.2的版本前存在重大安全隐患,因为JavaScript 可以使用反射访问注入webview的java对象的public fields,在一个包含不信任内容的WebView中使用这个方法,会允许攻击者去篡改宿主应用程序,使用宿主应用程序的权限执行java代码。因此4.2以后,任何为JS暴露的接口,都需要加 @JavascriptInterface 注释,这样,这个Java对象的fields 将不允许被JS访问。[2]
注:如果将targetSdkVersion 设置为17或者更高,但却没有给暴露的js接口加@JavascriptInterface注释,则logcat会报如下输出:
Console: Uncaught TypeError: Object [object Object] has no method 'toString'
(需要特注意的一点,这里的限制是通过 targetSdkVersion 为标准,即如果工程采用了android sdk的版本是4.2以上,但是 targetSdkVersion 的版本在17之下,那么该状态下生成的应用,不过报错,如果targetSdkVersion 设置为>=17 就需要特别主意,要加上 @JavascriptInterface注释语句了, 所有建议在各种版本下都采用@JavascriptInterface注释,就万无一失了)
6. 在做webview开发是经常会加载本机的html文件如下:
file:///android_asset/teste.html 加载项目assets下的文件teste.html
file:///sdcard/index.html 加载sdcard下的index.html文件
源代码:
android

1 private WebView mWebView;
2 private Handler mHandler = new Handler();
3
4 @Override
5 protected void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 setContentView(R.layout.main);
8 mWebView = (WebView) findViewById(R.id.webview);
9
10 WebSettings webSettings = mWebView.getSettings();
11 webSettings.setJavaScriptEnabled(true);
12 webSettings.setSavePassword(false);
13 webSettings.setSaveFormData(false);
14 webSettings.setSupportZoom(false);
15
16 mWebView.setWebChromeClient(new MyWebChromeClient());
17 mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
18 // mWebView.loadUrl("http://www.baidu.com/");
19 mWebView.loadUrl("file:///android_asset/demo.html");
20 }
21
22 final class DemoJavaScriptInterface {
23 DemoJavaScriptInterface() {
24 Log.i("aaaa", "create DemoJavaScriptInterface");
25 }
26 /**
27 * This is not called on the UI thread. Post a runnable to invoke
28 * loadUrl on the UI thread.
29 */
30 @JavascriptInterface
31 public void clickOnAndroid() {
32 mHandler.post(new Runnable() {
33 public void run() {
34 mWebView.loadUrl("javascript:wave()");
35 }
36 });
37 }
38 }
39 /**
40 * Provides a hook for calling "alert" from javascript. Useful for
41 * debugging your javascript.
42 */
43 final class MyWebChromeClient extends WebChromeClient {
44 @Override
45 public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
46 result.confirm();
47 return true;
48 }
49 }

html源文件

1 <!DOCTYPE html>
2 <html>
3 <script language="javascript">
4 /* This function is invoked by the activity */
5 function wave() {
6 alert("1");
7 document.getElementById("droid").src="android_waving.png";
8 alert("2");
9 }
10 </script>
11 <body>
12 <!-- Calls into the javascript interface for the activity -->
13 <a onClick="window.demo.clickOnAndroid()">
14 <div style="width:80px;
15 margin:0px auto;
16 padding:10px;
17 text-align:center;
18 border:2px solid #202020;" >
19 <img id="droid" src="android_normal.png"/><br>
20 Click me!
21 </div></a>
22 </body>
23 </html>
android和javascript之间相互通信实例分析的更多相关文章
- android + javascript 相互通信实例分析
1. AndroidManifest.xml中必须使用许可 "android.permission.INTERNET", 否则会出Web page not available错误 ...
- NanUI文档 - 如何实现C#与Javascript的相互通信
NanUI文档目录 NanUI简介 开始使用NanUI 打包并使用内嵌式的HTML/CSS/JS资源 使用网页来设计整个窗口 如何实现C#与Javascript的相互通信 如何处理NanUI中的下载过 ...
- Android单片机与蓝牙模块通信实例代码
Android单片机与蓝牙模块通信实例代码 参考路径:http://www.jb51.net/article/83349.htm 啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通 ...
- 不同vlan之间相互通信
不同VLAN之间相互通信的两种方式 (单臂路由.三层交换) 试验目的: 1.通过单臂路由实现不同VLAN之间的通信 2.通过三层交换路由功能实现不同VLAN之间的通信 网络拓扑图: 1.单臂路由实 ...
- android中四大组件之间相互通信
好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件.首先,接触android的人,都应该知道android中有四大组件,activity,service,broadca ...
- Android应用程序组件之间的通信Intent和IntentFilter
Android应用程序的基本组件,这些基本组建除了Content Provider之外,几乎全部都是依靠Intent对象来激活和通信的. 下面介绍Intent类,并通过例子来说明Intent一般用法 ...
- python多进程通信实例分析
操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...
- Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息
先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest; import android.app.Activity; import and ...
- 【转】不同VLAN之间相互通信及VTP、STP、EtherChannel概念
厘清最后一个概念. 转了网上两个相关帖子: http://www.net130.com/CMS/Pub/Tech/tech_zh/2009_03_12_97386_3.htm http://blog. ...
随机推荐
- Layout Resource官方教程(1)简介
Layout Resource SEE ALSO Layouts A layout resource defines the architecture for the UI in an Activit ...
- 【HDOJ】2295 Radar
DLX+二分. /* 2295 */ #include <iostream> #include <string> #include <map> #include & ...
- hdu4632Palindrome subsequence
http://acm.hdu.edu.cn/showproblem.php?pid=4632 TLE了N次 原因居然是取模次数太多了..! 这数据卡的好紧 还是我写的太搓..828ms挤过 s[i]= ...
- 普通pc电脑安装苹果系统mac_详细教程(精)附带所有工具下载
苹果操作系统只允许在苹果电脑上面安装和使用.和Windows不一样,要在PC上安装,需要一系列的模拟和破解.破解安装的过程很繁琐而具有挑战性,以下是安装10A432雪豹的PC安装指南,附带25张图片帮 ...
- [转] AC自动机详解
转载自:http://hi.baidu.com/nialv7/item/ce1ce015d44a6ba7feded52d AC自动机详解 AC自动机是用来处理多串匹配问题的,即给你很多串,再给你一篇文 ...
- 【转】VC中对文件的读写
原文网址:http://www.cnblogs.com/LJWJL/archive/2012/10/06/2712466.html 注意: 1.由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2 ...
- Vlan技术总结
VLAN主要有两个作用: vlan可以有效的控制广播域的范围 vlan可以分组设备,增强局域网的安全性(业务隔离) vlan的范围: 一共有4096个vlan,vlan 1为默认vlan.但其中vla ...
- [Buffalo]MVC架构模式
MVC架构模式:即Model(模型)-View(视图)-Controller(控制器). 很多人将MVC和所谓的“三层架构”进行比较,其实两者并没有什么可比性,MVC更不是分别对应着UI.业务逻辑和数 ...
- mongodb创建数据库和配置用户
上一篇我们说了mongodb远程连接配置,今天给大家说下mongodb怎么创建数据库和配置用户,毕竟光有远程连接是不够的,我们还要上去操作和放数据的. 系统:centos 5.x 环境:mon ...
- MarkdownPad2
http://markdownpad.com/ MarkdownPad2