安卓Android与H5双向交互MathJax展示数学公式(源码+解析)

博主就今天周五又做了个需求(安卓Android与H5交互),原来上线的功能是服务器配置过来的学习报告(一个H5页面)并提供原始的微信分享功能,今天增加的是反向需求,由APP提供给服务器配置过来的H5页面的子级页面调用原生的微信分享,理了一下逻辑(写好给JS调用的方法),然后就是配合前端H5妹子,开启一下午的混合开发测试。(过程省略十万字,读者自行脑补)

文章目录

  • 安卓Android与H5双向交互MathJax展示数学公式(源码+解析)
    • 一 本文记录安卓原生与H5交互(双向)快速实现
    • 二 实现安卓原生调用JS 方法
    • 三 实现JS调用原生方法
    • 四 Demo下载
    • 五 补充
    • 六 结尾
  备注:本文默认相关知识点,1,webview开发 2,微信SDK接入 3,朋友以及好友圈分享 4,Android与H5交互

安卓原生与H5双向调用完整例子 Demo
我们先上效果gif图,看图再分析

  • 图一:原生调用H5 **

需求:数学题型,mathjax原生支持库目前有坑,技术选型实现以原生嵌套H5快速实现做题题型,技术涉及viewpager+h5混合开发

  • 图二:H5调用原生(周一补上图二)

需求:H5页面课程,需要分享链接到微信,这就需要我们调用webview时,提供给JS来调用我们的接口,以实现H5调起原生的微信分享功能。

一 本文记录安卓原生与H5交互(双向)快速实现

1,Android与H5交互,首先要实现webview,以及相关配置
调用的本地webview.html文件,需要配置URL
private static final String URL = “file:///android_assetwebview.html”;

       //为了防止内存泄漏OOM,博主个人建议不在xml文件中创建WebviewFrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);mWebView = new WebView(getApplicationContext());mWebView.setLayoutParams(layoutParams);mFlWebviewContain.addView(mWebView);mWebSettings = mWebView.getSettings();//支持与JS交互mWebSettings.setJavaScriptEnabled(true);//支持插件//mWebSettings.s//设置自适应屏幕mWebSettings.setUseWideViewPort(true);mWebSettings.setLoadWithOverviewMode(true);//缩放操作mWebSettings.setSupportZoom(true);  //支持缩放,默认为true.是下面的那个的前提mWebSettings.setBuiltInZoomControls(true);  //设置内置的缩放控件mWebSettings.setDisplayZoomControls(false);  //隐藏原生的缩放控件//其他细节操作mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);  //不缓存,每次都从网络获取
//        mWebSettings.setAppCacheEnabled(true);mWebSettings.setAllowFileAccess(true);   //设置可以访问文件mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);  //支持通过JS打开新窗口mWebSettings.setLoadsImagesAutomatically(true);   //支持自动加载图片mWebSettings.setDefaultTextEncodingName("utf-8");  //设置编码格式

对应H5 Activity页面XML布局页面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/web_container"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="@color/color_55ceac"><RelativeLayoutandroid:id="@+id/rl_back"android:layout_width="80dp"android:layout_height="match_parent"><ImageViewandroid:id="@+id/iv_back"android:layout_width="40dp"android:layout_height="40dp"android:layout_centerVertical="true"android:layout_marginLeft="5dp"android:paddingLeft="10dp"android:paddingRight="10dp"android:src="@mipmap/retreat"/></RelativeLayout><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textColor="@color/white"android:textSize="16sp"/><!--分享图标--><ImageViewandroid:id="@+id/iv_share"android:layout_width="40dp"android:layout_height="40dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="15dp"android:padding="6dp"android:src="@mipmap/share"/><TextViewandroid:id="@+id/wte"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="15dp"android:textColor="@color/white"android:textSize="12sp"android:visibility="gone"/></RelativeLayout><ImageViewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="@color/login_btn_defalut"/><ProgressBarandroid:id="@+id/web_progress"style="?android:attr/progressBarStyleHorizontal"android:layout_width="match_parent"android:layout_height="6dp"android:max="100"/><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/fl_webview_contain"android:layout_width="match_parent"android:layout_height="match_parent"/><RelativeLayoutandroid:id="@+id/rl_load_error"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"android:clickable="true"android:visibility="gone"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:orientation="vertical"><ImageViewandroid:layout_width="170dp"android:layout_height="200dp"android:layout_gravity="center_horizontal"android:src="@mipmap/no_load"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="15dp"android:text="网络异常,点击重试"android:textColor="@color/color_5c5c5c"android:textSize="14sp"/></LinearLayout></RelativeLayout></FrameLayout></LinearLayout>

二 实现安卓原生调用JS 方法

核心代码: mWebView.loadUrl(“javascript:htmlCall(” + listarray+ “)”);

        //复写shouldOverrideUrlLoading()方法.使得打开网页时不调用系统浏览器,而是在本Webview中显示mWebView.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {return false;}//开始载入页面调用的,我们可以设定一个loading的页面,告诉用户程序在等待网络响应@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {}//在页面加载结束时调用.我们可以关闭loading条,切换程序动作@Overridepublic void onPageFinished(final WebView view, String url) {//访问JS方法mWebView.post(new Runnable() {@Overridepublic void run() {mWebView.loadUrl("javascript:htmlCall(" + contain + ")");}});}}//加载页面出现错误时@Overridepublic void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {//显示加载错误mRlWebviewLoading.setVisibility(View.GONE);mTvWebviewError.setVisibility(View.VISIBLE);}//webView默认是不处理https请求的,页面显示空白,需要进行如下设置@Overridepublic void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {handler.proceed();   //等待证书响应//handler.cancel();  //表示挂起连接,为默认方式//handler.handleMessage(null);   //可做其他处理}});

调用的本地webview.html

<!DOCTYPE html>
<html>
<head><title>MathJax TeX Test Page</title><!-- Copyright (c) 2010-2011 Design Science, Inc. --><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><script type="text/x-mathjax-config">MathJax.Hub.Config({tex2jax: {inlineMath: [["$","$"],["\\(","\\)"],["\[","\]"] ]},messageStyle: 'none',tex2jax: {preview: 'none'},displayAlign: "left",displayIndent: "2em"});MathJax.Hub.Queue(function () {var height = document.body.offsetHeight;MathJax.Hub.Queue(["Typeset", MathJax.Hub]);window.AndroidWebView.showInfoFromJs(height);});</script><script type="text/javascript" src="../MathJax.js?config=TeX-AMS_HTML-full"></script><style>*{margin:0;padding:0;}.contain{width: 100%;margin: 0 auto;padding-top:10px}.devide{padding-bottom: 20px;}img{max-width:100%;display:block;margin: 0 auto;}p{font-size:.14rem}body{word-wrap:break-word;font-family:Arial;}@media screen and (min-width:360px) and (max-width:414px) {html { font-size: 625%;}}@media screen and (min-width:415px) {html {font-size: 843.75%;}}@media screen and (min-width:320px) and (max-width:360px) {html {font-size: 550%;}}</style></head>
<!--<body style="opacity:0">-->
<body>
<div class="contain" id="sua"><div id="subjects_par" class="devide"><p style = "font-size:.16rem;font-weight:bold">【题目】</p><p id="subjects"></p></div><div id="answers_par" style="display: none"  class="devide"><p style = "font-size:.16rem;font-weight:bold">【答案】</p><p id="answers"></p></div><div id="analysis_par" style="display: none"  class="devide"><p style = "font-size:.16rem;font-weight:bold">【解析】</p><p id="analysis"></p></div>
</div>
</body><script>
<!-- 调用JS方法,输入数组参数-->var htmlCall = function(array){document.getElementById('subjects').innerHTML=array.subjects;document.getElementById('answers').innerHTML=array.answers;document.getElementById('analysis').innerHTML=array.analysis;if(array.question_finish == 1){document.getElementById('answers_par').style.display = 'block';document.getElementById('analysis_par').style.display = 'block';}}
</script></html>

三 实现JS调用原生方法

核心代码: //在js中调用本地java方法

        mWebView.addJavascriptInterface(new JsInterface(mContext), "AndroidWebView");

提供给JS调用类与方法

    /*** @ 创建:   kx* @ 时间:    2018/8/31* @ 描述:    接口提供给JS 调用原生分享        LoadH5UrlNoRefreshActivity*/public class JsInterface {private Context mContext;public JsInterface(Context context) {this.mContext = context;}/*** 在js中调用window.AndroidWebView.js2ShareWechat(title,text,mWebURl),便会触发此方法。** @param title 分享标题      例子:xx的学习报告* @param text  分享文本内容   例子:xx的学习报告新鲜出炉啦!赶快来围观~~*/@JavascriptInterfacepublic void js2ShareWechat(final String title, final String text, final String webURlL) {//TODO 原生回调微信分享runOnUiThread(new Runnable() {@Overridepublic void run() {showBroadView(title, text, AppConfig.H5HOST + webURlL);}});}/**提供给JS判断前段,Android or ios */@JavascriptInterfacepublic String jsString() {return "Android";}}

四 Demo下载

原生与H5双向调用完整例子 Demo

五 补充

webview返回处理,返回按钮的处理.判断webview能否canGoBack(),有则mWebView.goBack(),没有则原生的 finish();

      if (mWebView.canGoBack()) {mWebView.goBack(); //goBack()表示返回WebView的上一页面} else {finish();}

六 结尾

 一周的充实又紧凑的开发过后,在恬谧地周末得以放松并总结,写下此文,实乃高兴如有问题bug或者写的不当之处,请联系博主,请读者不吝赐教,博主感激不尽(博主邮箱593584960@qq.com)

安卓Android与H5双向交互MathJax展示数学公式(源码+解析)相关推荐

  1. EasyPusher实现安卓Android手机直播推送同步录像功能(源码解析)

    EasyPusher是一款非常棒的推送客户端.稳定.高效.低延迟,音视频同步等都特别好.装在安卓上可作为一款单兵设备来用.说到单兵,在项目中通常都需要边传边录的功能,因此后来EasyPusher也加入 ...

  2. C51单片机与PCF8591模块的交互:C语言源码解析

    目录 1. PCF8591模块简介 2. C51单片机与PCF8591的连接 3. C51单片机与PCF8591的C语言源码解析 4. 用法示例 5. 总结 6. 参考文献 在微控制器的世界中,C51 ...

  3. Android特别的数据结构(二)ArrayMap源码解析

    1. 数据结构 public final class ArrayMap<K,V> implements Map<K,V> 由两个数组组成,一个int[] mHashes用来存放 ...

  4. Android特别的数据结构(一) SparseArray源码解析

    1.数据结构 class SparseArray<E> implements Cloneable 由两个数组构成,一个数组mKeys类型为int[],存放Key,一个数组mValues类型 ...

  5. yolov3安卓实现_YOLOv3 的 TensorFlow 实现,GitHub 完整源码解析

    来自华盛顿大学的 Joseph Redmon 和 Ali Farhadi 提出的YOLOv3 通过在 YOLO 中加入设计细节的变化,这个新模型在取得相当准确率的情况下实现了检测速度的很大提升,一般它 ...

  6. 安卓开发者必看:Android的数据结构与算法——ArrayList源码解析

    作者:JerryloveEmily 原文链接:https://www.jianshu.com/p/159426e2aaf6 文章有点长,比较啰嗦,请耐心看完! 一.概述 首先得明白ArrayList在 ...

  7. Android图片爬虫,看妹纸神器项目源码,ListView单张图片查看

    Android图片爬虫,看妹纸神器项目源码 刚自学完安卓,国庆7七天花了6天纯手写入门级app,从集成图片爬虫到整个项目结束真是一步一个坑. 整个项目没有用框架,都是手写纯属练手,项目中主要用到的技术 ...

  8. 【Android项目】本地FM收音机开发及源码简析

    [Android项目]本地FM收音机开发及源码简析 目录 1.概述 2.收音机的基本原理 3.收音机其他信息 RDS功能 4.Android开发FM收音机源码解析 5.App层如何设计本地FM应用 6 ...

  9. 【源码篇】安卓源码解析(持续总结)

    前言 在Linux中,一切皆为文件.安卓底层也是基于Linux开发的. 在我们了解源码目录的时候,我们要先知道这些源码的后缀名代表的是什么文件,什么意思,才能更好的去了解其中的原理. 文章目录 前言 ...

最新文章

  1. 弹出框的鼠标拖拽事件
  2. randn函数加噪声_NLP入门指南01:感知机、激活函数、损失函数
  3. C#sql语句如何使用占位符
  4. 第48讲:分布式利器 Scrapy-Redis 原理
  5. 最短路--DijkstraFloyedSPFA
  6. kubernetes ui 搭建
  7. python找不到自带的argparse_python argparse用法总结
  8. lwip-1.4.1文档sys_arch翻译
  9. java spring 多数据源_Spring多数据源解决方案
  10. Python 抓取网页乱码问题 以及EXCEL乱码
  11. 我的世界启动器java_我的世界最新启动器 无需安装JAVA
  12. c语言实现输入电压检测,STC12C2052AD单片机AD转换C语言程序的实现
  13. Java多线程系列--“JUC线程池”03之 线程池原理(二)
  14. C语言————有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,下面的程序统计卖完西瓜所需的天数
  15. R语言柯西概率分布(cauchy distribution)函数(dcauchy, pcauchy, qcauchy rcauchy)实战
  16. Prometheus普罗米修斯调研笔记
  17. uniapp云开发微信小程序 云函数配置
  18. 广告拦截软件测试简历,ADSafe广告拦截效果测试
  19. 记一次对易班前端解密的经过
  20. 主机名以及内外部命令

热门文章

  1. echart vue
  2. UE 某图局部 展UV 图标 / CSS 精灵图(sprite) 好像
  3. [GXYCTF2019]Ping Ping Ping 1解题思路
  4. Preserving Semantic Neighborhoods for RobustCross-modal Retrieval
  5. Excel打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”最快的解决办法
  6. PPT幻灯片演示模式设置
  7. 使用AcronisTrueImage 2020迁移thinkpad x1 carbon 2016(4th gen) win10系统到1t的固态硬盘970evoPlus的过程
  8. 创建一个IntelliJ Idea文件模板,将光标放在文件中的特定位置
  9. Pro Android学习笔记(一五五):传感器(5): 磁场传感器和方位(上)
  10. java实现word文件转图片,支持分页