作项目时候会遇到咱们用WebView 打开一个web,但愿这个web能够调用本身的一些方法,好比咱们在进一个web页面,而后当咱们点击web上的某个按钮时,但愿能判断当前手机端是否已经登陆,若是未登陆,那么就会跳转到登陆页面(登录页面是另外一个Activity)。这个时候,一个简单的作法就是在按钮动做事件的js上调用java的方法,从而起到判断是否登陆,并决定是否跳转到另外一个页面。javascript
Google的WebView为咱们提供了 addJavascriptInterface(Object obj, String interfaceName)方法,这个方法的第一个参数是传给Web的对象,第二个参数是该对象的对象名。html
写个简单的例子java
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方面要如何调用该方法。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)就能够了,没什么特别要注意的地方。api
特别注意:Android的WebView存在安全漏洞,由于js调用对象是能够经过反射再调用Runtime甚至可能以web挂马形式控制主机,google也认可webView这个功能太强了,给了web很大的权利,Android 4.2 (api17)已经开始采用新的接口方法,@JavascriptInterface 代替addjavascriptInterface, 可是低版本上是不能避免。安全