Android js相互调用

一、webview相当于android中的浏览器,基于webkit开发,可以浏览网页文件,支持css javas cript 以及html

1 webview.getSettings().setJavaScriptEnabled(true);//允许JS执行

2 settings.setJavaScriptCanOpenWindowsAutomatically(true);//允许JS执行
3 webview.addJavascriptInterface(object,"name");//把Name="name"的对象添加到object中。object如果是this,就是window.name

加载本机的html文件如下:

file:///android_asset/teste.html   加载项目assets下的文件teste.html

file:///sdcard/index.html       加载sdcard下的index.html文件

1 webview.loadUrl("file:///android_asset/index.html");//注意这个资源的位置是跟res并列的文件夹下。

如果在用webview做应用的时候我们不希望新建webview进程,让程序跳来跳去那么进行如下设置

1 webv.setWebViewClient(new WebViewClient(){
2       public boolean shouldOverrideUrlLoading(WebView view, String url) {
3              view.loadUrl(url);//点击超链接的时候重新在原来进程上加载URL
4              return true;
5      }
6 });   

在javascript中调用java方法

1.先将一个当前的java对象绑定到一个javascript上面,使用如下方法

1 webview.addJavascriptInterface(this, "js2java");//this为当前对象,绑定到js的someThing上面,主要js2java的作用域是全局的。一旦初始化便可随处运行
1 addJavascriptInterface//方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用Handler的目的。
1 //映射Java对象"JSInvokeClass"到一个名为”js2java“的Javascript对象上
2 //JavaScript中可以通过"window.js2java"来调用Java对象的方法
3 mWebView.addJavascriptInterface(new JSInvokeClass(), "js2java");
1 /**网页Javascript调用接口**/
2 class JSInvokeClass {
3     public void back() {
4         activity.finish();
5     }
6 }
1 //JavaScript调用Java对象示例
2 <body >

  2.定义被调用的java方法

例子:

 1 public class JavaJsDemo extends Activity {
 2
 3
 4     private WebView webview;
 5
 6     @Override
 7
 8     public void onCreate(Bundle savedInstanceState) {
 9
10         super.onCreate(savedInstanceState);
11
12         setContentView(R.layout.main);
13
14         webview = (WebView)findViewById(R.id.webview);
15
16         webview.getSettings().setJavaScriptEnabled(true);
17
18         webview.addJavascriptInterface(this, "js2java");
19
20         webview.loadUrl("file:///android_asset/index.html");
21
22     }
23
24     public void printMsg(String msg){
25
26             System.out.println("----------msg:" + msg);
27
28     }
29
30     public void clickDoWork(){
31
32            webview.loadUrl("javascript:doSomeWork()");
33
34     }
35
36 }

html代码:

 1 <html>
 2
 3     <head>
 4
 5         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
 6
 7         <title></title>
 8
 9         <script language="javascript" type="html/text">
10
11             function doSomeWork(){
12     document.getElementById("helloweb").innerHTML="HelloWebView";
13
14             }
15
16         </script>
17
18     </head>
19
20     <body >
21
22     <div id="hellowebview">
23
24        <a onClick="window.js2java.clickDoWork">
25             <img id="androidimg" src="android_normal.png"/>
26             <br>
27             Click me!
28        </a>
29
30     </div>
31
32   </body>
33
34 </html>       
 1 public class JavaJsWebViewDemo extends Activity {
 2     private WebView mWebView;
 3     private Handler mHandler = new Handler();
 4
 5     public void onCreate(Bundle icicle) {
 6         super.onCreate(icicle);
 7         setContentView(R.layout.webviewdemo);
 8         mWebView = (WebView) findViewById(R.id.webview);
 9         WebSettings webSettings = mWebView.getSettings();
10         webSettings.setJavaScriptEnabled(true);
11         mWebView.addJavascriptInterface(new Object() {
12             public void clickDoWork() {
13                 mHandler.post(new Runnable() {
14                     public void run() {
15                         mWebView.loadUrl("javascript:doSomeWork()");
16                     }
17                 });
18             }, 
24          public void printMsg(String msg){
25
26               System.out.println("----------msg:" + msg);
27
28          }
19       }, "js2java"); 20 mWebView.loadUrl("file:///android_asset/demo.html"); 21  } 22 }

注意:

使用addJavascriptInterface在安卓4.2以下是有安全漏洞的,可以用这篇文章http://www.pedant.cn/2014/07/04/webview-js-java-interface-research/的原理, 来规避这个漏洞来的问题, 完全是JS层面的解析调用,而且包装得更全面,分析得更彻底!

时间: 2024-10-04 12:32:34

Android js相互调用的相关文章

关于action script与js相互调用的Security Error问题

大家都知道,as和js相互调用可以通过ExternalInterface.call和ExternalInterface.addCallback来进行. 比较好的做法是使用之前通过ExternalInterface.available来检测一下是否可用. 然而被坑了的是,这个ExternalInterface.available并不检测安全限制,也就是即使ExternalInterface.available=true,还是可能报错. 为了防止报错阻断程序正常运行,还需要再包一层try catch

php与js相互调用

2019-2-3 php与js相互调用<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><script type="text/javascript"> function test() { var t1=3; t1 = t1+2; alert(t1); return t1; } </script> <?php $name='J

WebView使用详解(一)——Native与JS相互调用(附JadX反编译)

前言:念念不忘,必有回响,永远坚持你所坚持的! 一直在用WebView,还没有系统的总结过它的用法,下面就系统的总结下,分享给大家 一.基本用法 1.加载在线URL void loadUrl(String url) 这个函数主要加载url所对应的网页地址,或者用于调用网页中的指定的JS方法(调用js方法的用法,后面会讲),但有一点必须注意的是:loadUrl()必须在主线程中执行!!!否则就会报错!!!.注意:加载在线网页地址是会用到联网permission权限的,所以需要在AndroidMan

WebBrowser(IE) 与 JS 相互调用

在开发中我们经常将WebBrowser控件嵌入Winform 程序来浏览网页,既然是网页那么少不了JS.下面就让我们来说说他们两之间的相互调用. 在C#封装的浏览器内核中,Chromium 内核封装有Xilium.Cefglue.Cefsharp,Webkit 内核封装 Webkit.Net .OpenWebKitSharp等. 但是说到和JS的调用,不得不说还是IE 的WebBrowser 最为简单方便.至于IE 为啥方便而其他的不方便,以后我会写文章分析. 下面我们还是先看看WebBrows

flex与js相互调用

1.flex调用js方法 调用方法例如:ExternalInterface.call("UploadComplete",oldName,uidName,_dir+"/"+uidName+type); 第一个是js方法名,后面几个是给这个js方法传的参数.这个方法必须在网页的js中注册,否则会调用失败. 需要注意的是调用之前需要检查网页的js是否已完成加载,用ExternalInterface.available可是判断. 注:这种调用方法是可以有返回值的,例如:va

as3.0和js相互调用,js控制flash的颜色

程序应用场景:flash是一副地图,地图上一单击,就调用js,弹出一个对话框,显示一些自己想要的信息:js定时调用as提供的方法,然后去改变flash的颜色. 以下是as代码: import flash.events.MouseEvent; import flash.text.TextField; //给每一栋楼增加监听事件 mc0001.addEventListener(MouseEvent.CLICK,onClick); mc0004.addEventListener(MouseEvent.

android WebView java与js相互调用

android webView js 使用1.js调用java    1.1 js代码    <script type="text/javascript">        function call(){            window.androidInterface.call('02585818031');        }    </script> 1.2.java代码    package com.example.webview;    import

Objective-c与js相互调用

原文地址:http://blog.csdn.net/ikmb/article/details/6716831 一 objective-c调用js NSString *currentURL = [webView stringByEvaluatingJavaScriptFromString:@"document.location.href"]; //注: webView是UIWebView实例 二 js调用objective-c 1.obj-c部分 - (void)viewDidLoad 

Android中通过WebView控件实现与JavaScript方法相互调用的地图应用

在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用android方法,在这里我个人觉得有点和DWR相似. 为了让大家容易理解,我写了一个简单的Demo,具体步骤如下: 第一步:新建一个Android工程,命名为WebViewDemo(这里我在assets里定义了一个html页面). 第二步:修改main.xml布局文件,增加了一个WebView控件还有But