原文出处:http://motalks.cn/2016/08/27/Android-WebView-JavaScript-2/

WebView相关阅读

  • Android WebView 和 javaScript的互相调用(一)
  • Android WebView 和 javaScript的互相调用(二)
  • Android WebView 和 javaScript的互相调用(三)
  • Android WebView与js交互通信
  • Android 4.4 中 WebView 使用注意事项
  • Android WebView开发问题汇总
  • Android WebView 性能优化

一、Demo动图演示

动图镇楼,演示功能点的顺序是:5-1-2-3-4

二、怎么生成我们需要的 HTML 页面?

当我们get了WebView 和 JavaScript交互的技能时,准备跃跃欲试的时候,就会对这个被这个问题搞懵逼了,他娘的我又不是前端,要我立马写个自己想要的HTML页面臣妾真的办不到啊。

三、w3school是什么?

是什么?你咋不点进去看看呢?

四、我们需要的 HTML 页面

按照w3school的简单教程我们就可以拼凑出我们所需要的页面了,如下图。

五、我们要实现的5个功能

  • Android Native 端调用 HTML 中的 javascript 脚本
  • Android Native 端调用 HTML 中的 javascript 脚本并传递参数
  • HTML 中的 javascript 脚本调用 Android Native 端的函数
  • HTML 中的 javascript 脚本调用Android Native 端的函数并传递参数
  • HTML 中的 javascript 脚本与 Android Native端的 Java 代码完整交互流程

1、Android Native 端调用 HTML 中的 js 脚本

该例子中Android Native 端的 java 代码会直接调用 HTML 页面中的js 脚本,实现更改 HTML 页面 subtitle 的功能。

Android Native 端的代码为:

mCallJsBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mCallJsWithArgsBtn.setText("Native调用WebView的有参JS脚本");mWebView.loadUrl("javascript:changeDemoSubtitle()");}});

HTML 对应的 js 方法是:

function changeDemoSubtitle(){
document.getElementById("subtitle").innerHTML="我加了点料";
}

2、Android Native 端调用 HTML 中的 js 脚本并传递参数

Android Native 端的代码为:

mCallJsWithArgsBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mCallJsWithArgsBtn.setText("参数为:" + showDevInfo());showDevInfoToH5();}});private String showDevInfo() {return "showDevInfo('手机型号:" + android.os.Build.MODEL +",SDK版本:" + android.os.Build.VERSION.SDK +",系统版本:" + android.os.Build.VERSION.RELEASE + "')";
}private void showDevInfoToH5() {mWebView.loadUrl("javascript:" + showDevInfo());
}

HTML 对应的 js 方法是:

function showDevInfo(info){
document.getElementById("subtitle").innerHTML=info;
}

3、HTML 中的 javascript 脚本调用 Android Native 端的函数

HTML 对应的 js 方法是:

function disp_confirm(){confirm();
}

Android Native 端的代码为:

mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result) {Toast.makeText(MainActivity2.this, "Android_Native_Toast!", Toast.LENGTH_SHORT).show();}result.confirm();return true;}});

4、HTML 中的 javascript 脚本调用Android Native 端的函数并传递参数

HTML 对应的 js 方法是:

function disp_confirm_with_args(message){confirm(message);}

Android Native 端的代码为:

mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result) {Toast.makeText(MainActivity2.this, "Android_Native_Toast!接收到的参数message:" + message, Toast.LENGTH_SHORT).show();}result.confirm();return true;}});

5、HTML 中的 javascript 脚本与 Android Native端的 Java 代码完整交互流程

HTML 对应的 js 方法是:

function disp_confirm_with_args(message){confirm(message);}<input type="button" onclick="disp_confirm_with_args('getDevInfo')" value="点击获取用户手机信息"/>

Android Native 端的代码为:

mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result) {if ("getDevInfo".equals(message)) {showDevInfoToH5();} }result.confirm();return true;}});private String showDevInfo() {return "showDevInfo('手机型号:" + android.os.Build.MODEL +",SDK版本:" + android.os.Build.VERSION.SDK +",系统版本:" + android.os.Build.VERSION.RELEASE + "')";
}private void showDevInfoToH5() {mWebView.loadUrl("javascript:" + showDevInfo());
}

Android Native 端代码完整展示:

Activity 代码:

public class MainActivity2 extends Activity {private WebView mWebView;
private Button mCallJsBtn;
private Button mCallJsWithArgsBtn;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main_2);initView();initWebView();
}private void initView() {mWebView = (WebView) findViewById(R.id.webview);mCallJsBtn = (Button) findViewById(R.id.call_js_without_args_btn);mCallJsWithArgsBtn = (Button) findViewById(R.id.call_js_with_args_btn);mCallJsBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mCallJsWithArgsBtn.setText("Native调用WebView的有参JS脚本");mWebView.loadUrl("javascript:changeDemoSubtitle()");}});mCallJsWithArgsBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mCallJsWithArgsBtn.setText("参数为:" + showDevInfo());showDevInfoToH5();}});
}private void initWebView() {//开启JavaScript功能mWebView.getSettings().setJavaScriptEnabled(true);//加载本地htmlmWebView.loadUrl("file:///android_asset/JsDemo.html");mWebView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result) {if ("getDevInfo".equals(message)) {showDevInfoToH5();} else if (TextUtils.isEmpty(message)) {Toast.makeText(MainActivity2.this, "Android_Native_Toast!", Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity2.this, "Android_Native_Toast!接收到的参数message:" + message, Toast.LENGTH_SHORT).show();}//回调通知H5页面用户操作已完成,可以再次点击相关按钮result.confirm();//设为true,可以消耗掉H5页面的confirm弹窗。return true;}});
}private String showDevInfo() {return "showDevInfo('手机型号:" + android.os.Build.MODEL +",SDK版本:" + android.os.Build.VERSION.SDK +",系统版本:" + android.os.Build.VERSION.RELEASE + "')";
}private void showDevInfoToH5() {mWebView.loadUrl("javascript:" + showDevInfo());}
}

XML 代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayout
    android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#000000"android:orientation="vertical"><TextView
        android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="10dp"android:paddingBottom="10dp"android:paddingTop="10dp"android:text="Android_Native"android:textColor="#FFFFFF" /><Button
        android:id="@+id/call_js_without_args_btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="Native调用WebView的JS脚本" /><Button
        android:id="@+id/call_js_with_args_btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:paddingBottom="10dp"android:paddingTop="10dp"android:text="Native调用WebView的有参JS脚本" />
</LinearLayout><WebView
    android:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FFFFFF"/>
</LinearLayout>

AndroidManifest 文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="cn.mtalks.jsbridgedemo"><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity2"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>

友情提示

其实在JavaScript调用 Java本地方法,谷歌官方的实现方法应该是使用 JavascriptInterface 方式。但是该方式在 Android4.2版本之前存在安全漏洞,感兴趣的看这里。在Android4.2版本之后加入了@JavascriptInterface注解才得以解决,考虑到目前 Android 版本碎片化太严重,使用JavascriptInterface并不适合,这也是上篇文章没把它放入效率对比的原因。

以上就是一个完整的 WebView 与 JavaScript 的交互例子。大家可以自己动手试试上篇文章介绍的ShouldInterceptRequest方式来实现这个例子。

Android WebView 和 javaScript的互相调用(三)相关推荐

  1. Android WebView 和 javaScript的互相调用(二)

    原文出处:http://blog.csdn.net/wangtingshuai/article/details/8635787 WebView相关阅读 Android WebView 和 javaSc ...

  2. Android WebView 和 javaScript的互相调用(一)

    原文出处:http://blog.csdn.net/wangtingshuai/article/details/8631835 WebView相关阅读 Android WebView 和 javaSc ...

  3. Android WebView与JavaScript交互详解

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

  4. android webview打印,javascript - 如何在Android Webview中使网站上的打印按钮工作? - 堆栈内存溢出...

    我的网站上有一个模式按钮,在该按钮上附加了一个处理程序函数以打印模式. 该处理程序具有处理"仅打印模式"的代码,并最终运行window.print(). 该按钮的功能类似于浏览器中 ...

  5. Android WebView和JavaScript交互

    JavaScript在现在的网页设计中用得很多,Android 的WebView可以载入网页,WebView也设计了与JavaScript通信的桥梁.这篇主要介绍一下WebViewk控件如何和Java ...

  6. Android WebView 性能优化

    原文出处:http://motalks.cn/2016/09/11/Android-WebView-JavaScript-3/ WebView相关阅读 Android WebView 和 javaSc ...

  7. Android WebView混合开发实战演习

    WebView混合开发实战 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成 ...

  8. 【eoe Android特刊】第二十四期Android WebView

    一.Android WebView是什么 1.1Aandroid WebView一些基本概念 在android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件. ...

  9. Android webview基础知识

    1. 打开网页时不调用系统浏览器, 而是在本WebView中显示: mWebView.setWebViewClient(new WebViewClient(){@Overridepublic bool ...

最新文章

  1. 单v100 GPU,4小时搜索到一个鲁棒的网络结构
  2. navbar build by Bootstrap3.x + RubyOnRails +Haml
  3. CCleaner v5.55.7108 发布,新增软件升级功能
  4. 小程序仿 axios 请求封装
  5. 【Python】20个小技巧,让数据可视化图表更专业!
  6. 控制用户输入字符的个数
  7. 面试官:Spring为什么建议使用构造器来注入?
  8. 普通人有必要学新媒体吗?
  9. Prototype的JSON支持
  10. maven 相关简介,和操作命令
  11. HashTable Dictionary HashMap
  12. 133个Java面试问题列表
  13. Makefile入门教程
  14. windows开启远程Wmi服务支持
  15. python opencv轮廓检测_python opencv 来对图片(苹果)的轮廓(最大轮廓进行识别)进行...
  16. 用java写一个算工作日期的功能(考虑到节假日以及补班的情况)
  17. Python中sorted()排序与字母大小写的问题
  18. html5虚拟试衣,Trylive Clothing虚拟试衣系统 打造属于你个人的魔法试衣间
  19. 中国市场 Android App 兼容性报告
  20. JS生成二维码(兼容各种浏览器及中文)

热门文章

  1. 收藏几个有意思的SQL脚本
  2. DEDECMS站点内容自动更新到新浪微博的方法
  3. 广域网智能流量调度—Vecloud
  4. Android应用从树莓派读取数据
  5. svn命令行使用说明
  6. JPA和Hibernate的关系(转)
  7. win7 右键菜单增加“在此以管理模式运行命令行”
  8. Visual Assist X 安装、使用 和 快捷键
  9. 谷歌体三维捕捉新突破:实现后期任意照明修改
  10. Docker部署配置相关使用总结