做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录,那么就会跳转到登录页面(登陆页面是另一个Activity)。这个时候,一个简单的做法就是在按钮动作事件的js上调用java的方法,从而起到判断是否登录,并决定是否跳转到另一个页面。
Google的WebView为我们提供了 addJavascriptInterface(Object obj, String interfaceName)方法,这个方法的第一个参数是传给Web的对象,第二个参数是该对象的对象名。
public class WebActivity extends Activity{ ProgressBar mProgressBar; WebView mWebView; String mUrl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.web); mWebView = (WebView) findViewById(R.id.web_view); mProgressBar = (ProgressBar) findViewById(R.id.loading_progress); doWebViewSetting(); // 加载网页 loadUrl("http://172.10.1.2:8080/test"); } private void doWebViewSetting(){ // 设置WebClient(可不要) mWebView.setWebViewClient(new MyWebViewClient()); // 支持js(必要) mWebView.getSettings().setJavaScriptEnabled(true); // 添加js对象(必要) mWebView.addJavascriptInterface(new JsOperation(this), "client"); } private void loadUrl(String url) { mUrl = url; mProgressBar.setVisibility(View.VISIBLE); mWebView.loadUrl(url); } class MyWebViewClient extends WebViewClient{ @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mProgressBar.setVisibility(View.GONE); } } class JsOperation { Activity mActivity; public JsOperation(Activity activity) { mActivity = activity; } // 测试方法 @javascriptInterface public void test() { Toast.makeText(mActivity,"test",Toast.LENGTH_SHORT).show(); } }
以上是我的WebActivity ,我这里只简单的实现的加载时进度条显示和提供对象给js。可以看出,我们提供了一个JsOperation 对象给web,然后在JsOperation 类中定义了test()方法。接下来就看看,Web方面要如何调用该方法。
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>测试</title> <script type="text/javascript"> function test(){ client.test() } </script> </head> <body> <br /> <button onclick="test()">test</button> </body> </html>
web的实现方式特别简单,直接调用我们提供的对象,这里要注意的是,对象名是我们之前传入的String,这里是client,直接调用它的test()方法,就能弹出一个Toast了,当然你也可以在这个方法里做其他的各种处理,也可以提供多个方法,如果你需要传入参数,那么在java上定义好形参后,js上就正常的调用方法并传入参数,如client.test(param)就可以了,没什么特别要注意的地方。
特别注意:Android的WebView存在安全漏洞,因为js调用对象是可以通过反射再调用Runtime甚至可能以web挂马形式控制主机,google也承认webView这个功能太强了,给了web很大的权利,Android 4.2 (api17)已经开始采用新的接口方法,@JavascriptInterface 代替addjavascriptInterface, 但是低版本上是不能避免。
相关推荐
android使用webView实现java程序与js脚本的相互调用,
android demo,webview_js(webview的js方法调用java方法)。
主要介绍了android webview中使用Java调用JavaScript方法并获取返回值,本文直接给出代码示例,需要的朋友可以参考下
android开发WebView中js与java代码的相互调用
js和java 互调,绝非单纯的js中调用java代码。自身已通过测试可用
android + h5 混合开发 webview 版 小实例 + 数据交互 + 界面交互+ js调用java +java 调用js
Android 中不在用webview的情况下 执行js代码并得到返回值
简单实现了WebView中js调用Android以及Android对js的调用
本文讲解了JavaScript与Java之间的相互的调用的一个小例子,在实际开发中经常用到。
资源文章地址 http://blog.csdn.net/wangtingshuai/article/details/8631835
Android 中通过WebView和HTML实现JS交互 Android(Java)与JavaScript(HTML)交互有四种情况: 1) Android(Java)调用HTML中js代码 2) Android(Java)调用HTML中js代码(带参数) 3) HTML中js调用Android...
用Java代码调用WebView中的js函数、也可以用WebView中的js来调用Android应用中的Java代码,有无参数,有无返回值,包含多种实现方式。
Android 和 IOS WebView javaScript与 Native 互相调用(JS 与O-C Java )
安卓app开发之在WebView中通过javascript调用android中的java代码.这是hybrid app混合开发的核心技术所在----js和native代码互相调用
使用开源库com.github.lzyzsd.jsbridge实现JS与JAVA相互通信,简单失效好用! 介绍:http://blog.csdn.net/chenxh515/article/details/50953914
主要介绍了Android中在WebView里实现Javascript调用Java类的方法,本文直接给出示例,需要的朋友可以参考下
做过 Android 混合开发的,应该都知道 Android 中 Java 代码和 Javascript 代码之间的交互怎么做。 首先回顾一下 Java 和 Javascript 之间的交互。 JavaScript 调用 Java Android 中 WebView 添加供 Html 页面调用的...
WebView实现Java与JS相互调用
webView调用JS出错。 代码如下: class TestJS { …… public TestJS(){ } public void save(String data){ webView.loadUrl(“[removed] alert(” + data +”)”); } …… } ...