zoukankan      html  css  js  c++  java
  • 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层面的解析调用,而且包装得更全面,分析得更彻底!

  • 相关阅读:
    Spring/Hibernate应用性能调优
    Hibernate调试——定位查询源头
    Spring @Transactional工作原理
    Java EE7和Maven工程入门(1)—— 一个简单Maven工程的结构
    Java抽象类与接口的区别
    8张图理解Java
    JSP PO VO BO DTO POJO DAO解释
    Java面试参考指南(二)
    Java面试参考指南(一)
    Java线程面试题 Top 50
  • 原文地址:https://www.cnblogs.com/CharlesGrant/p/4742689.html
Copyright © 2011-2022 走看看