Android js相互调用
2015-08-19 16:49
411 查看
一、webview相当于android中的浏览器,基于webkit开发,可以浏览网页文件,支持css javas cript 以及html
加载本机的html文件如下:
file:///android_asset/teste.html 加载项目assets下的文件teste.html
file:///sdcard/index.html 加载sdcard下的index.html文件
如果在用webview做应用的时候我们不希望新建webview进程,让程序跳来跳去那么进行如下设置
在javascript中调用java方法
1.先将一个当前的java对象绑定到一个javascript上面,使用如下方法
2.定义被调用的java方法
例子:
html代码:
注意:
使用addJavascriptInterface在安卓4.2以下是有安全漏洞的,可以用这篇文章http://www.pedant.cn/2014/07/04/webview-js-java-interface-research/ 的原理, 来规避这个漏洞来的问题, 完全是JS层面的解析调用,而且包装得更全面,分析得更彻底!
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层面的解析调用,而且包装得更全面,分析得更彻底!
相关文章推荐
- android布局------RelativeLayout(相对布局)详解
- Android adb命令启动系统组件
- Android 点击空白处隐藏键盘
- android开发工具
- Android自定义布局
- Android笔记(二)LogCat
- 大约Android 了解权限管理
- 分享:Android系统的常用权限整理
- Android开发之ExpandableListView扩展
- android加密解密完美教程
- Android 管理Log日志
- Android 代码混淆
- android.os.NetworkOnMainThreadException(未开启子线程)
- 【Android开发笔记】viewpager+fragment对adapter的选择
- android中include的用法
- Android 问题之找不到资源解决办法
- Android Studio 快捷键
- Android SDK Manager不能显示所有包的解决办法
- 【Android】Paint的效果研究
- Android 数据存储与IO之File存储