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之间相互通信实例分析的更多相关文章

  1. android + javascript 相互通信实例分析

    1.  AndroidManifest.xml中必须使用许可 "android.permission.INTERNET", 否则会出Web page not available错误 ...

  2. NanUI文档 - 如何实现C#与Javascript的相互通信

    NanUI文档目录 NanUI简介 开始使用NanUI 打包并使用内嵌式的HTML/CSS/JS资源 使用网页来设计整个窗口 如何实现C#与Javascript的相互通信 如何处理NanUI中的下载过 ...

  3. Android单片机与蓝牙模块通信实例代码

    Android单片机与蓝牙模块通信实例代码 参考路径:http://www.jb51.net/article/83349.htm 啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通 ...

  4. 不同vlan之间相互通信

    不同VLAN之间相互通信的两种方式 (单臂路由.三层交换) 试验目的: 1.通过单臂路由实现不同VLAN之间的通信 2.通过三层交换路由功能实现不同VLAN之间的通信   网络拓扑图: 1.单臂路由实 ...

  5. android中四大组件之间相互通信

    好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件.首先,接触android的人,都应该知道android中有四大组件,activity,service,broadca ...

  6. Android应用程序组件之间的通信Intent和IntentFilter

    Android应用程序的基本组件,这些基本组建除了Content Provider之外,几乎全部都是依靠Intent对象来激活和通信的. 下面介绍Intent类,并通过例子来说明Intent一般用法 ...

  7. python多进程通信实例分析

    操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...

  8. Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息

    先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest; import android.app.Activity; import and ...

  9. 【转】不同VLAN之间相互通信及VTP、STP、EtherChannel概念

    厘清最后一个概念. 转了网上两个相关帖子: http://www.net130.com/CMS/Pub/Tech/tech_zh/2009_03_12_97386_3.htm http://blog. ...

随机推荐

  1. Trigger Execution Sequence in Oracle Forms

    Introduction ------------ This document lists the order in which triggers fire in Oracle Forms 4.5: ...

  2. USACO3.22Stringsobits

    DP预处理出来 i位不超过j的个数 然后再进行从小到大找第一个比I大的 然后用I减掉上一个比I小的 剩余的按照之前的方法循环找 知道剩余为0 细节挺繁琐的 对照数据改了又改 最后一组数据还超 了int ...

  3. c程序设计语言_习题1-11_学习单元测试,自己生成测试输入文件

    How would you test the word count program? What kinds of input are most likely to uncover bugs if th ...

  4. 【Android】Android程序保护与破解浅析

    此文源自组内成员分享的PPT,其他成员的文档由于没有得到授权,暂不公开. 本文命令如果没有特殊注明,均为windows 7环境. 本文只涉及大概的知识点,不涉及具体的细节,需要注意. 反编译 apkt ...

  5. OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图

    读取bmp等图片格式中的像素还有难度,就先用这个棋盘图象素来弄了 代码打错一个就一直First-chance exception ,貌似还有一个要用q或者Q才能成功退出,不知道缺少哪句,我用窗口红叉退 ...

  6. 解决SQL数据库无法脱机的问题

    数据库无法脱机:原理——有人在占用. 解决办法: select * from master.sys.sysprocesses where dbid=db_id('数据库名称') kill [id]

  7. Esper系列(三)Context和Group by

    Context 把不同的事件按照框的规则框起来(规则框在partition by中定义),并且有可能有多个框,而框与框之间不会互相影响. 功能: 组合事件查询并进行分组,类型:Hash Context ...

  8. Drupal安装及使用问题解决列表

    #1. 启动 Clean URL 修改Apache的配置文件(如httpd.conf),打开 LoadModule rewrite_module modules/mod_rewrite.so选项.然后 ...

  9. HW5.17

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  10. HDOJ-ACM1010(JAVA) 奇偶剪枝法 迷宫搜索

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5568822.html 第一次遇到迷宫搜索,给我的感觉是十分惊喜的:搞懂这个的话,感觉自己又掌握了一项技能~ 个人 ...