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

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

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

首先,在js中如下:

[javascript] view plaincopy
  1. <script type="text/javascript">
  2. window.οnlοad=function(){
  3. var btn_net=document.getElementById("btn_net");
  4. btn_net.οnclick=function(){
  5. window.js_invoke.goNetSetting();
  6. }
  7. var btn_err=document.getElementById("btn_err");
  8. btn_err.οnclick=function(){
  9. window.js_invoke.reload();
  10. }
  11. };
  12. </script>

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

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

[java] view plaincopy
  1. this.mainView.addJavascriptInterface(new RemoteInvokeService(this, this.mainView, this.url, null), "js_invoke");

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

[java] view plaincopy
  1. public void goNetSetting()
  2. {
  3. this.context.startActivityForResult(new Intent("android.settings.WIRELESS_SETTINGS"), 0);
  4. }
  5. public void reload()
  6. {
  7. this.webView.loadUrl(this.url);
  8. }

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

[java] view plaincopy
  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 plaincopy
  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. </script>
  31. </head>
  32. <body>
  33. <div id="page">
  34. <div class="section">
  35. <p class="bg_err">网络出错</p>
  36. </div>
  37. <div class="section">
  38. <ul>
  39. <p>可能的原因有:</p>
  40. <li>无手机信号或信号太弱</li>
  41. <li>当前接入点已失效或过期</li>
  42. <li>为正确开通手机上网服务</li>
  43. </ul>
  44. </div>
  45. <div class="section">
  46. <p style="text-align: center;"><a  id="btn_err" class="btn_err" href="#"></a><a id="btn_net" class="btn_net" href="#"></a></p>
  47. </div>
  48. </div>
  49. </body>
  50. </html>

RemoteInvokeService.java

[java] view plaincopy
  1. package cn.com.web;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.webkit.WebView;
  5. public class RemoteInvokeService {
  6. private Activity context;
  7. private String url;
  8. private WebView webView;
  9. public RemoteInvokeService(Activity paramActivity, WebView paramWebView,
  10. String paramString1) {
  11. this.context = paramActivity;
  12. this.webView = paramWebView;
  13. this.url = paramString1;
  14. }
  15. public void goNetSetting() {
  16. this.context.startActivityForResult(new Intent(
  17. "android.settings.WIRELESS_SETTINGS"), 0);
  18. }
  19. public void reload() {
  20. this.webView.loadUrl(this.url);
  21. }
  22. }

主要代码:

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

代码下载

Android WebView与js交互通信相关推荐

  1. Android WebView与JS交互入门

    2019独角兽企业重金招聘Python工程师标准>>> 首先在Anndroid代码中对WebView进行初始化 webView = (WebView) findViewById(R. ...

  2. Android WebView 与 JS 交互

    2019独角兽企业重金招聘Python工程师标准>>> 在android activity webView的使用,activity中执行html中的js 方法, 和在html 中 调 ...

  3. Android—WebView与JS交互

    Html文件: WebView与JS交互方式: 1. 前提: WebSettings webSettings = webView.getSettings(); // 设置与Js交互的权限 webSet ...

  4. 移动开发周刊:Android ImageView正确使用、WebView与JS交互解析

    写在前面 从 2011 年创建首刊至今,移动开发周刊内容聚焦 Android.iOS.VR/AR 等前沿移动开发技术,精选一周最热点,解读开发技巧,从中希望能够让你有一些收获,如果你有好的文章以及优化 ...

  5. android webview 监听js,Android webview与js的数据交互

    项目要用到Webview和js交互,查了查以前的项目感觉还是有必要整理下的. 简单描述下项目中用到的地方,比如说在web页需要用到登录的地方点击登录跳转到APP原生登录界面去登录,点击web页的拨打电 ...

  6. js获取android数据,Android webview与js的数据交互

    项目要用到Webview和js交互,查了查以前的项目感觉还是有必要整理下的. 简单描述下项目中用到的地方,比如说在web页需要用到登录的地方点击登录跳转到APP原生登录界面去登录,点击web页的拨打电 ...

  7. Android WebView与JavaScript交互详解

    近期工作项目中遇到Android的WebView与js交互问题,之前也知道有这方面的技术可以实现.但在用的过程中,却发现还是需要用电心思. 现把我所了解的分享给大家,希望可以帮助到做类似项目的童鞋. ...

  8. android webView 与 JS交互方式

    webView 与JS交互 Android调用JS代码的方法有: 通过WebView的loadUrl() 通过WebView的evaluateJavascript() 对于JS调用Android代码的 ...

  9. WebView---android webview组件如何使用 Webview与js交互

    浏览器控件是每个开发环境都具备的,这为马甲神功提供了用武之地,windows的有webbrowser,android和ios都有webview.只是其引擎不同,相对于微软的webbrowser,and ...

最新文章

  1. pytorch randomresizedcrop
  2. R语言 非中心化F分布
  3. JavaScript世界的一等公民
  4. 百度全面开放HTTPS之我见
  5. gorilla/mux 的学习
  6. fatal: unable to access ‘https://github.comxxxxxxxxxxx‘: Failed to connect to xxxxxxxxxxxxx
  7. 合作 | IEIC·IT耳朵智能创新大会:人工智能落地将带来新风口
  8. Linux命令解释之df
  9. 使用复合数据类型——PL/SQL记录表
  10. ImportError: No module named matplotlib.pyplot
  11. Android 操作权限大全 (android.permission)
  12. html实现下载功能(两种方式)
  13. 导出指定layer或指定区域layout的GDS
  14. 鼠标右键转圈圈_鼠标点击右键后一直转圈圈
  15. 一种全国产化军用计算机设计大赛,北科大新闻网-我校多支团队在中国大学生计算机设计大赛全国总决赛中斩获佳绩...
  16. Oxffff转换成十进制
  17. 给iOS App减肥
  18. 基于TLE6220GP的开关电磁阀驱动电路
  19. Easyui Datagrid 中用 Combotree 的显示问题
  20. 汽车发动机如何做保养,名悦集团教你几个小技巧

热门文章

  1. Tfs 2010使用小技巧
  2. 转:Oracle 应用服务器 MapViewer 10.1.2截图
  3. DEDE如何调用指定文章ID来调用特定文档
  4. 树莓派:django,uwsgi,nginx安装与设置
  5. 细说plsql中的空值表达式
  6. 浅谈Spring MVC知识
  7. 《程序是怎样跑起来的》第四章
  8. Description Resource Path Location Type Project configuration is not up-to-d
  9. 认识微软Visual Studio Tools for AI
  10. js检测数据类型的方法你都掌握了几个?