您的位置:首页 > 移动开发 > Android开发

Android js相互调用

2015-08-19 16:49 411 查看
一、webview相当于android中的浏览器,基于webkit开发,可以浏览网页文件,支持css javas cript 以及html

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

2 settings.setJavaScriptCanOpenWindowsAutomatically(true);//允许JS执行

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文件

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


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

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


在javascript中调用java方法

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

webview.addJavascriptInterface(this, "js2java");//this为当前对象,绑定到js的someThing上面,主要js2java的作用域是全局的。一旦初始化便可随处运行


addJavascriptInterface//方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用Handler的目的。


//映射Java对象"JSInvokeClass"到一个名为”js2java“的Javascript对象上
//JavaScript中可以通过"window.js2java"来调用Java对象的方法
mWebView.addJavascriptInterface(new JSInvokeClass(), "js2java");


/**网页Javascript调用接口**/
class JSInvokeClass {
public void back() {
activity.finish();
}
}


//JavaScript调用Java对象示例
<body onload="javascript:window.js2java.back()">


  2.定义被调用的java方法

例子:

public class JavaJsDemo extends Activity {

private WebView webview;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

webview = (WebView)findViewById(R.id.webview);

webview.getSettings().setJavaScriptEnabled(true);

webview.addJavascriptInterface(this, "js2java");

webview.loadUrl("file:///android_asset/index.html");

}

public void printMsg(String msg){

System.out.println("----------msg:" + msg);

}

public void clickDoWork(){

webview.loadUrl("javascript:doSomeWork()");

}

}


html代码:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

<title></title>

<script language="javascript" type="html/text">

function doSomeWork(){
document.getElementById("helloweb").innerHTML="HelloWebView";

}

</script>

</head>

<body onload="javascript:window.js2java.printMsg('HelloWebView')">

    <div id="hellowebview">

      <a onClick="window.js2java.clickDoWork">
    <img id="androidimg" src="android_normal.png"/>
    <br>
    Click me!
      </a>

    </div>

  </body>

</html>


public class JavaJsWebViewDemo extends Activity {
private WebView mWebView;
private Handler mHandler = new Handler();

public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.webviewdemo);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new Object() {
public void clickDoWork() {
mHandler.post(new Runnable() {
public void run() {
mWebView.loadUrl("javascript:doSomeWork()");
}
});
},

24          public void printMsg(String msg){
25
26               System.out.println("----------msg:" + msg);
27
28          }

      }, "js2java");
mWebView.loadUrl("file:///android_asset/demo.html");   }  }


注意:

使用addJavascriptInterface在安卓4.2以下是有安全漏洞的,可以用这篇文章http://www.pedant.cn/2014/07/04/webview-js-java-interface-research/ 的原理, 来规避这个漏洞来的问题, 完全是JS层面的解析调用,而且包装得更全面,分析得更彻底!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: