Android js相互调用
一、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层面的解析调用,而且包装得更全面,分析得更彻底!
Android js相互调用的更多相关文章
- 关于action script与js相互调用的Security Error问题
大家都知道,as和js相互调用可以通过ExternalInterface.call和ExternalInterface.addCallback来进行. 比较好的做法是使用之前通过ExternalInt ...
- android js 互相调用
代码地址如下:http://www.demodashi.com/demo/13107.html android js 互相调用 第二版 支持js匿名函数接收 支持js json对象接收 支持js函数返 ...
- CefSharp 与 js 相互调用及注意事项
CefSharp 与 js 相互调用 一. CefSharp调用 js CefSharp.WinForms.ChromiumWebBrowser wb; ... 方式1. ExecuteScriptA ...
- WebView使用详解(一)——Native与JS相互调用(附JadX反编译)
念念不忘,必有回响,永远坚持你所坚持的! 一直在用WebView,还没有系统的总结过它的用法,下面就系统的总结下,分享给大家 一.基本用法 1.加载在线URL void loadUrl(String ...
- WebBrowser(IE) 与 JS 相互调用
在开发中我们经常将WebBrowser控件嵌入Winform 程序来浏览网页,既然是网页那么少不了JS.下面就让我们来说说他们两之间的相互调用. 在C#封装的浏览器内核中,Chromium 内核封装有 ...
- flex与js相互调用
1.flex调用js方法 调用方法例如:ExternalInterface.call("UploadComplete",oldName,uidName,_dir+"/&q ...
- 【转】CefSharp 与 js 相互调用
转自CSDN博客博主ghui,虽然博主说要经过他同意才能转,我只是做笔记用,没做他用,所以请博主理解,在此感谢博主! 一. CefSharp调用 js CefSharp.WinForms.Chromi ...
- CefSharp 与 js 相互调用
https://blog.csdn.net/gong_hui2000/article/details/48155547
- Android中通过WebView控件实现与JavaScript方法相互调用的地图应用
在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用andro ...
随机推荐
- SESSION机制
一:Session与Cookie Session:在服务器端创建并存放在服务器的内存中的,Session的内容存储是键值对的列表,格式:名称 | 类型:长度:值 Session的生命周期:在php.i ...
- MVC - 20.前台ajax分页
1.用pager方法,输入参数,会返回一个导航条的html字符串.方法的内部比较简单. ajax-pager.js /** * pageSize, 每页显示数 * pageIndex, 当前页数 * ...
- 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...
- 回溯法解决N皇后问题(以四皇后为例)
以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度 ...
- SQL数据字符串的拆分
一.概述: MSSQL字符串的拆分没有封装太多常用的方式,所以如果向数据库中插入用特殊字符分割字符串(比如CB0$CB2$CB3,CB0$CB2$CB3)时就可能需要数据库能够分割字符串,SQL中拆分 ...
- Auto Layout
Auto Layout XCode5+ Auto Layout Concepts 核心的概念是约束. Constraint Basics Constant value Relation Priorit ...
- hdu 4069 福州赛区网络赛I DLC ***
再遇到一个DLC就刷个专题 #include <stdio.h> #include <string.h> #include <iostream> #include ...
- ASP.NET 5探险(2):上传文件
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在ASP.NET 5(MVC 6)中处理上传文件的方式和之前有所不同. 在MVC 5之 ...
- JMockit
[TOC] 简介 JMockit是基于JavaSE5中的java.lang.instrument包开发,内部使用ASM库来动态修改java的字节码,使得java这种静态语言可以想动态脚本语言一样动态设 ...
- sp_executesql的用法
之前做项目的时候负责一个成绩分析的模块儿,写存储过程的时候因为考试的科目是不固定的,所以导致查找成绩的sql语句也是动态的,就用到了sp_executesql,下面就来说一说它的用法 需求:表名是动态 ...