Android WebView与js交互通信

来源:互联网 发布:淘宝交易指数查询 编辑:程序博客网 时间:2024/04/30 01:30

事出有因,那天我看到手厅的客户端里,在网页webview中点击网络设置后,跳转到了手机的网络设置界面,然后就搜了一下,原来是html中js与androidApp之间的交互。这么说的太费劲了,还是上截图吧,如下:


手机没网的时候,会弹出上面这个网页,然后我们通过快捷按钮“网络设置”后,界面跳转到如下


这个是通过js和webview共同完成的一个交互效果。

首先,在js中如下:

[javascript] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <script type="text/javascript">  
  2. window.onload=function(){  
  3.     var btn_net=document.getElementById("btn_net");  
  4.     btn_net.onclick=function(){  
  5.        window.js_invoke.goNetSetting();  
  6.     }  
  7.     var btn_err=document.getElementById("btn_err");  
  8.     btn_err.onclick=function(){  
  9.        window.js_invoke.reload();  
  10.     }  
  11. };  
  12.   
  13. </script>  

其中window后面的"js_invoke"这个别名是和app中webview设置的对象别名一致的,下面会写到,而后面的goNetSetting()和reload()方法是那个对象的里的方法。

然后,在activity对webview做一个关键的设置如下:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. this.mainView.addJavascriptInterface(new RemoteInvokeService(thisthis.mainView, this.url, null), "js_invoke");  

RemoteInvokeService(……)这个对象就是上面提到的对象,这里面我们定义了网络设置和重新加载的方法,例如下:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void goNetSetting()  
  2. {  
  3.   this.context.startActivityForResult(new Intent("android.settings.WIRELESS_SETTINGS"), 0);  
  4. }  
  5.   
  6.   public void reload()  
  7. {  
  8.   this.webView.loadUrl(this.url);  
  9. }  

当然了,这个对象的构造函数不一样要传这几个参数,根据需求传就可以了。这里的构造函数是这样:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public RemoteInvokeService(Activity paramActivity, WebView paramWebView, String paramString1, String paramString2)  
  2.  {  
  3.    this.context = paramActivity;  
  4.    this.webView = paramWebView;  
  5.    this.url = paramString1;  
  6.    this.returnIntent = paramString2;  
  7.  }  

error.html:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5. <title>无标题文档</title>  
  6. <link href="css/style_Ning.css" rel="stylesheet" type="text/css" />  
  7. <style type="text/css">  
  8. body{background:#0F2030;}  
  9. #page{  
  10.     border:1px solid #223442; background:#223442;  
  11.     border-radius:8px;  
  12.     -webkit-border-radius:8px;  
  13.     -moz-border-radius:8px;  
  14.     -o-border-radius:8px;  
  15.     margin-top:20px;  
  16.     color:#fff;  
  17. }  
  18. </style>  
  19. <script type="text/javascript">  
  20. window.onload=function(){  
  21.     var btn_net=document.getElementById("btn_net");  
  22.     btn_net.onclick=function(){  
  23.        window.js_invoke.goNetSetting();  
  24.     }  
  25.     var btn_err=document.getElementById("btn_err");  
  26.     btn_err.onclick=function(){  
  27.        window.js_invoke.reload();  
  28.     }  
  29. };  
  30.   
  31. </script>  
  32. </head>  
  33. <body>  
  34. <div id="page">  
  35.     <div class="section">  
  36.         <p class="bg_err">网络出错</p>  
  37.     </div>  
  38.     <div class="section">  
  39.         <ul>  
  40.             <p>可能的原因有:</p>  
  41.             <li>无手机信号或信号太弱</li>  
  42.             <li>当前接入点已失效或过期</li>  
  43.             <li>为正确开通手机上网服务</li>  
  44.         </ul>  
  45.     </div>  
  46.     <div class="section">  
  47.         <p style="text-align: center;"><a  id="btn_err" class="btn_err" href="#"></a><a id="btn_net" class="btn_net" href="#"></a></p>  
  48.     </div>  
  49. </div>  
  50. </body>  
  51. </html>  

RemoteInvokeService.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package cn.com.web;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.webkit.WebView;  
  6.   
  7. public class RemoteInvokeService {  
  8.     private Activity context;  
  9.     private String url;  
  10.     private WebView webView;  
  11.   
  12.     public RemoteInvokeService(Activity paramActivity, WebView paramWebView,  
  13.             String paramString1) {  
  14.         this.context = paramActivity;  
  15.         this.webView = paramWebView;  
  16.         this.url = paramString1;  
  17.     }  
  18.   
  19.     public void goNetSetting() {  
  20.         this.context.startActivityForResult(new Intent(  
  21.                 "android.settings.WIRELESS_SETTINGS"), 0);  
  22.     }  
  23.   
  24.     public void reload() {  
  25.         this.webView.loadUrl(this.url);  
  26.     }  
  27. }  

主要代码:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package cn.com.web;  
  2.   
  3. import cn.com.web.R;  
  4. import android.app.Activity;  
  5. import android.app.AlertDialog;  
  6. import android.content.DialogInterface;  
  7. import android.graphics.Bitmap;  
  8. import android.os.Bundle;  
  9. import android.view.KeyEvent;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12. import android.view.Window;  
  13. import android.view.View.OnTouchListener;  
  14. import android.webkit.WebChromeClient;  
  15. import android.webkit.WebView;  
  16. import android.webkit.WebViewClient;  
  17. import android.widget.EditText;  
  18. import android.widget.ImageView;  
  19. import android.widget.LinearLayout;  
  20. import android.widget.TextView;  
  21. import android.widget.Toast;  
  22.   
  23. /** 
  24.  * 浏览器 
  25.  *  
  26.  */  
  27. public class WebViewApp extends Activity {  
  28.   
  29.     /** webview控件 */  
  30.     private WebView webView;  
  31.   
  32.     /** 当前url地址 */  
  33.     private String browserUrl = "file:///android_asset/error.html";  
  34.   
  35.     @Override  
  36.     protected void onCreate(Bundle savedInstanceState) {  
  37.         super.onCreate(savedInstanceState);  
  38.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  39.         // getWindow().requestFeature(Window.FEATURE_PROGRESS);// 用title bar做进度条  
  40.         // requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);// 用title  
  41.         setContentView(R.layout.browser_layout);  
  42.         initWebView();  
  43.     }  
  44.   
  45.     /** 
  46.      * 初始化webview 
  47.      */  
  48.     private void initWebView() {  
  49.         // 得到webView的引用  
  50.         webView = (WebView) findViewById(R.id.browser_layout_webview);  
  51.         // 支持JavaScript  
  52.         webView.getSettings().setJavaScriptEnabled(true);  
  53.         // 支持缩放  
  54.         webView.getSettings().setBuiltInZoomControls(true);  
  55.         // 支持保存数据  
  56.         webView.getSettings().setSaveFormData(false);  
  57.   
  58.         // 清除缓存  
  59.         webView.clearCache(true);  
  60.         // 清除历史记录  
  61.         webView.clearHistory();  
  62.         // 联网载入  
  63.         webView.loadUrl(browserUrl);  
  64.         // String baseUrl = "file:///android_asset";  
  65.         // webView.loadDataWithBaseURL(baseUrl, browserUrl, "text/html",  
  66.         // "utf-8", null);  
  67.         // 设置  
  68.         webView.setWebViewClient(new WebViewClient() {  
  69.   
  70.             /** 开始载入页面 */  
  71.             @Override  
  72.             public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  73.                 setProgressBarIndeterminateVisibility(true);// 设置标题栏的滚动条开始  
  74.                 browserUrl = url;  
  75.                 super.onPageStarted(view, url, favicon);  
  76.             }  
  77.   
  78.             /** 捕获点击事件 */  
  79.             public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  80.                 webView.loadUrl(url);  
  81.                 return true;  
  82.             }  
  83.   
  84.             /** 错误返回 */  
  85.             @Override  
  86.             public void onReceivedError(WebView view, int errorCode,  
  87.                     String description, String failingUrl) {  
  88.                 super.onReceivedError(view, errorCode, description, failingUrl);  
  89.             }  
  90.   
  91.             /** 页面载入完毕 */  
  92.             @Override  
  93.             public void onPageFinished(WebView view, String url) {  
  94.                 setProgressBarIndeterminateVisibility(false);// 设置标题栏的滚动条停止  
  95.                 super.onPageFinished(view, url);  
  96.             }  
  97.   
  98.         });  
  99.   
  100.         webView.setWebChromeClient(new WebChromeClient() {  
  101.             /** 设置进度条 */  
  102.             public void onProgressChanged(WebView view, int newProgress) {  
  103.                 // 设置标题栏的进度条的百分比  
  104.                 WebViewApp.this.getWindow().setFeatureInt(  
  105.                         Window.FEATURE_PROGRESS, newProgress * 100);  
  106.                 super.onProgressChanged(view, newProgress);  
  107.             }  
  108.   
  109.             /** 设置标题 */  
  110.             public void onReceivedTitle(WebView view, String title) {  
  111.                 WebViewApp.this.setTitle(title);  
  112.                 super.onReceivedTitle(view, title);  
  113.             }  
  114.         });  
  115.         webView.addJavascriptInterface(new RemoteInvokeService(WebViewApp.this,  
  116.                 webView, "http://www.baidu.com/"), "js_invoke");  
  117.     }  
  118.   
  119.     /** 
  120.      * 捕获返回键 
  121.      */  
  122.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  123.         if ((keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack())) {  
  124.             webView.goBack();  
  125.             return true;  
  126.         }  
  127.         return super.onKeyDown(keyCode, event);  
  128.     }  
  129.   
  130. }  

代码下载

0 0
原创粉丝点击