Android WebView与js交互通信
事出有因,那天我看到手厅的客户端里,在网页webview中点击网络设置后,跳转到了手机的网络设置界面,然后就搜了一下,原来是html中js与androidApp之间的交互。这么说的太费劲了,还是上截图吧,如下:
手机没网的时候,会弹出上面这个网页,然后我们通过快捷按钮“网络设置”后,界面跳转到如下
这个是通过js和webview共同完成的一个交互效果。
首先,在js中如下:
- <script type="text/javascript">
- window.οnlοad=function(){
- var btn_net=document.getElementById("btn_net");
- btn_net.οnclick=function(){
- window.js_invoke.goNetSetting();
- }
- var btn_err=document.getElementById("btn_err");
- btn_err.οnclick=function(){
- window.js_invoke.reload();
- }
- };
- </script>
其中window后面的"js_invoke"这个别名是和app中webview设置的对象别名一致的,下面会写到,而后面的goNetSetting()和reload()方法是那个对象的里的方法。
然后,在activity对webview做一个关键的设置如下:
- this.mainView.addJavascriptInterface(new RemoteInvokeService(this, this.mainView, this.url, null), "js_invoke");
RemoteInvokeService(……)这个对象就是上面提到的对象,这里面我们定义了网络设置和重新加载的方法,例如下:
- public void goNetSetting()
- {
- this.context.startActivityForResult(new Intent("android.settings.WIRELESS_SETTINGS"), 0);
- }
- public void reload()
- {
- this.webView.loadUrl(this.url);
- }
当然了,这个对象的构造函数不一样要传这几个参数,根据需求传就可以了。这里的构造函数是这样:
- public RemoteInvokeService(Activity paramActivity, WebView paramWebView, String paramString1, String paramString2)
- {
- this.context = paramActivity;
- this.webView = paramWebView;
- this.url = paramString1;
- this.returnIntent = paramString2;
- }
error.html:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>无标题文档</title>
- <link href="css/style_Ning.css" rel="stylesheet" type="text/css" />
- <style type="text/css">
- body{background:#0F2030;}
- #page{
- border:1px solid #223442; background:#223442;
- border-radius:8px;
- -webkit-border-radius:8px;
- -moz-border-radius:8px;
- -o-border-radius:8px;
- margin-top:20px;
- color:#fff;
- }
- </style>
- <script type="text/javascript">
- window.onload=function(){
- var btn_net=document.getElementById("btn_net");
- btn_net.onclick=function(){
- window.js_invoke.goNetSetting();
- }
- var btn_err=document.getElementById("btn_err");
- btn_err.onclick=function(){
- window.js_invoke.reload();
- }
- };
- </script>
- </head>
- <body>
- <div id="page">
- <div class="section">
- <p class="bg_err">网络出错</p>
- </div>
- <div class="section">
- <ul>
- <p>可能的原因有:</p>
- <li>无手机信号或信号太弱</li>
- <li>当前接入点已失效或过期</li>
- <li>为正确开通手机上网服务</li>
- </ul>
- </div>
- <div class="section">
- <p style="text-align: center;"><a id="btn_err" class="btn_err" href="#"></a><a id="btn_net" class="btn_net" href="#"></a></p>
- </div>
- </div>
- </body>
- </html>
RemoteInvokeService.java
- package cn.com.web;
- import android.app.Activity;
- import android.content.Intent;
- import android.webkit.WebView;
- public class RemoteInvokeService {
- private Activity context;
- private String url;
- private WebView webView;
- public RemoteInvokeService(Activity paramActivity, WebView paramWebView,
- String paramString1) {
- this.context = paramActivity;
- this.webView = paramWebView;
- this.url = paramString1;
- }
- public void goNetSetting() {
- this.context.startActivityForResult(new Intent(
- "android.settings.WIRELESS_SETTINGS"), 0);
- }
- public void reload() {
- this.webView.loadUrl(this.url);
- }
- }
主要代码:
- package cn.com.web;
- import cn.com.web.R;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.DialogInterface;
- import android.graphics.Bitmap;
- import android.os.Bundle;
- import android.view.KeyEvent;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.Window;
- import android.view.View.OnTouchListener;
- import android.webkit.WebChromeClient;
- import android.webkit.WebView;
- import android.webkit.WebViewClient;
- import android.widget.EditText;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- import android.widget.Toast;
- /**
- * 浏览器
- *
- */
- public class WebViewApp extends Activity {
- /** webview控件 */
- private WebView webView;
- /** 当前url地址 */
- private String browserUrl = "file:///android_asset/error.html";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- // getWindow().requestFeature(Window.FEATURE_PROGRESS);// 用title bar做进度条
- // requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);// 用title
- setContentView(R.layout.browser_layout);
- initWebView();
- }
- /**
- * 初始化webview
- */
- private void initWebView() {
- // 得到webView的引用
- webView = (WebView) findViewById(R.id.browser_layout_webview);
- // 支持JavaScript
- webView.getSettings().setJavaScriptEnabled(true);
- // 支持缩放
- webView.getSettings().setBuiltInZoomControls(true);
- // 支持保存数据
- webView.getSettings().setSaveFormData(false);
- // 清除缓存
- webView.clearCache(true);
- // 清除历史记录
- webView.clearHistory();
- // 联网载入
- webView.loadUrl(browserUrl);
- // String baseUrl = "file:///android_asset";
- // webView.loadDataWithBaseURL(baseUrl, browserUrl, "text/html",
- // "utf-8", null);
- // 设置
- webView.setWebViewClient(new WebViewClient() {
- /** 开始载入页面 */
- @Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- setProgressBarIndeterminateVisibility(true);// 设置标题栏的滚动条开始
- browserUrl = url;
- super.onPageStarted(view, url, favicon);
- }
- /** 捕获点击事件 */
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- webView.loadUrl(url);
- return true;
- }
- /** 错误返回 */
- @Override
- public void onReceivedError(WebView view, int errorCode,
- String description, String failingUrl) {
- super.onReceivedError(view, errorCode, description, failingUrl);
- }
- /** 页面载入完毕 */
- @Override
- public void onPageFinished(WebView view, String url) {
- setProgressBarIndeterminateVisibility(false);// 设置标题栏的滚动条停止
- super.onPageFinished(view, url);
- }
- });
- webView.setWebChromeClient(new WebChromeClient() {
- /** 设置进度条 */
- public void onProgressChanged(WebView view, int newProgress) {
- // 设置标题栏的进度条的百分比
- WebViewApp.this.getWindow().setFeatureInt(
- Window.FEATURE_PROGRESS, newProgress * 100);
- super.onProgressChanged(view, newProgress);
- }
- /** 设置标题 */
- public void onReceivedTitle(WebView view, String title) {
- WebViewApp.this.setTitle(title);
- super.onReceivedTitle(view, title);
- }
- });
- webView.addJavascriptInterface(new RemoteInvokeService(WebViewApp.this,
- webView, "http://www.baidu.com/"), "js_invoke");
- }
- /**
- * 捕获返回键
- */
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if ((keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack())) {
- webView.goBack();
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
- }
代码下载
Android WebView与js交互通信相关推荐
- Android WebView与JS交互入门
2019独角兽企业重金招聘Python工程师标准>>> 首先在Anndroid代码中对WebView进行初始化 webView = (WebView) findViewById(R. ...
- Android WebView 与 JS 交互
2019独角兽企业重金招聘Python工程师标准>>> 在android activity webView的使用,activity中执行html中的js 方法, 和在html 中 调 ...
- Android—WebView与JS交互
Html文件: WebView与JS交互方式: 1. 前提: WebSettings webSettings = webView.getSettings(); // 设置与Js交互的权限 webSet ...
- 移动开发周刊:Android ImageView正确使用、WebView与JS交互解析
写在前面 从 2011 年创建首刊至今,移动开发周刊内容聚焦 Android.iOS.VR/AR 等前沿移动开发技术,精选一周最热点,解读开发技巧,从中希望能够让你有一些收获,如果你有好的文章以及优化 ...
- android webview 监听js,Android webview与js的数据交互
项目要用到Webview和js交互,查了查以前的项目感觉还是有必要整理下的. 简单描述下项目中用到的地方,比如说在web页需要用到登录的地方点击登录跳转到APP原生登录界面去登录,点击web页的拨打电 ...
- js获取android数据,Android webview与js的数据交互
项目要用到Webview和js交互,查了查以前的项目感觉还是有必要整理下的. 简单描述下项目中用到的地方,比如说在web页需要用到登录的地方点击登录跳转到APP原生登录界面去登录,点击web页的拨打电 ...
- Android WebView与JavaScript交互详解
近期工作项目中遇到Android的WebView与js交互问题,之前也知道有这方面的技术可以实现.但在用的过程中,却发现还是需要用电心思. 现把我所了解的分享给大家,希望可以帮助到做类似项目的童鞋. ...
- android webView 与 JS交互方式
webView 与JS交互 Android调用JS代码的方法有: 通过WebView的loadUrl() 通过WebView的evaluateJavascript() 对于JS调用Android代码的 ...
- WebView---android webview组件如何使用 Webview与js交互
浏览器控件是每个开发环境都具备的,这为马甲神功提供了用武之地,windows的有webbrowser,android和ios都有webview.只是其引擎不同,相对于微软的webbrowser,and ...
最新文章
- pytorch randomresizedcrop
- R语言 非中心化F分布
- JavaScript世界的一等公民
- 百度全面开放HTTPS之我见
- gorilla/mux 的学习
- fatal: unable to access ‘https://github.comxxxxxxxxxxx‘: Failed to connect to xxxxxxxxxxxxx
- 合作 | IEIC·IT耳朵智能创新大会:人工智能落地将带来新风口
- Linux命令解释之df
- 使用复合数据类型——PL/SQL记录表
- ImportError: No module named matplotlib.pyplot
- Android 操作权限大全 (android.permission)
- html实现下载功能(两种方式)
- 导出指定layer或指定区域layout的GDS
- 鼠标右键转圈圈_鼠标点击右键后一直转圈圈
- 一种全国产化军用计算机设计大赛,北科大新闻网-我校多支团队在中国大学生计算机设计大赛全国总决赛中斩获佳绩...
- Oxffff转换成十进制
- 给iOS App减肥
- 基于TLE6220GP的开关电磁阀驱动电路
- Easyui Datagrid 中用 Combotree 的显示问题
- 汽车发动机如何做保养,名悦集团教你几个小技巧