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 onload="javascript:window.js2java.back()">

  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 onload="javascript:window.js2java.printMsg('HelloWebView')">
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层面的解析调用,而且包装得更全面,分析得更彻底!

原文地址:https://www.cnblogs.com/CharlesGrant/p/4742689.html