Android 和 H5 通信
有需要与h5通信的需求,写了一个helper类,处理与h5通信。
import android.content.Context;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
/**
* Created by Awen on 2016/12/14.
*/
public class WebViewHelper {
private final String CALLJS = "javascript:%s(%s)";
private WebView myBrowser;
private MyJavaScriptInterface myJavaScriptInterface;
private Handler mHandler; public WebViewHelper(WebView myBrowser, MyJavaScriptInterface myJavaScriptInterface, Handler handler) {
this.myBrowser = myBrowser;
this.myJavaScriptInterface = myJavaScriptInterface;
this.mHandler = handler;
} public void initWebView(String url) {
WebSettings webSettings = myBrowser.getSettings();
myBrowser.addJavascriptInterface(myJavaScriptInterface, "JavaScriptInterface");
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(true);// 设置允许访问文件数据
webSettings.setSupportZoom(false);
webSettings.setBuiltInZoomControls(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
webSettings.setDomStorageEnabled(true); //myBrowser.loadUrl(Config.getServerAddress().replace("/server", url));
myBrowser.loadUrl("http://192.168.1.14/h5" + url);
myBrowser.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
myBrowser.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getAction() == MotionEvent.ACTION_UP
&& myBrowser.canGoBack()) {
mHandler.sendEmptyMessage(0);
return true;
} return false;
} });
myBrowser.setWebChromeClient(new WebChromeClient());
} public static abstract class MyJavaScriptInterface {
protected Context mContext; public MyJavaScriptInterface() {
mContext = WtpApplication.getInstance();
} public abstract void requestShopId();
} public void callJs(String method, Object... param) {
String format = String.format(CALLJS, method, getParam(param));
myBrowser.loadUrl(format);
} public void callJsIntegerParam(String method, Object param) {
String tmp = (String) param;
while (tmp.length() > 1 && tmp.indexOf("0") == 0) {
tmp = tmp.replaceFirst("0", "");
}
callJs(method, tmp);
} private String getParam(Object... param) {
if (param == null || param.length < 1)
return "";
StringBuilder sb = new StringBuilder("");
for (Object str : param) {
sb.append("'").append(str).append("',");
}
return sb.deleteCharAt(sb.length()-1).toString();
} /**
* 返回上几步
* @param step 步数,为负数
*/
public void backStep(int step) {
if (myBrowser.canGoBackOrForward(step))
myBrowser.goBackOrForward(step);
}
}
调用类
public class TencentZoneFragment extends BaseSupperFragment<MainEvent> {
private final int SET_SHOP_ID = 1;
private final int SHOW_TOAST = 2;
@ViewById(R.id.wv_web)
WebView myBrowser; private WebViewHelper webViewHelper; @Override
public void initData() {
TencentJavaScriptInterface tencentJavaScriptInterface = new TencentJavaScriptInterface();
webViewHelper = new WebViewHelper(myBrowser, tencentJavaScriptInterface, handler);
webViewHelper.initWebView("/h5.html");
} @Override
public void onEventMainThread(MainEvent event) {
switch (event.getEventId()) {
case MainEvent.CLEAR_INFO:
int step = -2;
webViewHelper.backStep(step);
break;
}
}
public class TencentJavaScriptInterface extends WebViewHelper.MyJavaScriptInterface { @JavascriptInterface
public void requestShopId() {
handler.sendEmptyMessage(SET_SHOP_ID);
} @JavascriptInterface
public void showToast(String msg) {
Message message = Message.obtain();
message.what = SHOW_TOAST;
message.obj = msg; handler.sendMessage(message);
}
} private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) { switch (msg.what) {
case 0:
myBrowser.goBack();
break;
case SET_SHOP_ID:
webViewHelper.callJs("setId", 1);
break;
case SHOW_TOAST:
Object obj = msg.obj;
if (obj != null) {
ToastCommom.ToastShow((String) obj);
}
break;
}
}
};
}
Android 和 H5 通信的更多相关文章
- Android开发--Socket通信
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
- Android与H5交互(java与js的交互)
一.理论概述 1.js调用java方法 直接调用WebView的该方法就可以添加接口了,不过先要启动交互 // 启用javascript mWebView.getSettings().setJavaS ...
- Android和WCF通信 - 大数据压缩后传输
Android和WCF通信 - 大数据压缩后传输 本帖来源:http://www.cnblogs.com/lykbk/archive/2013/08/15/3259045.html 最近一直在优化项目 ...
- Android 之 Socket 通信
Android 之 Socket 通信 联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket Server ...
- Android基础_web通信3
在Android基础_web通信2中,我运用的JSONObject是Android原生的json类,通过import org.json.JSONObject来导入. 还有另外一种更简单的方法,就是用G ...
- Android基础_web通信
一.发展史 1G 模拟制式手机,只能进行语音通话2G 数字制式手机,增加接收数据等功能3G 智能手机,它已经成了集语音通信和多媒体通信相结合,并且包括图像.音乐.网页浏览.电话会议以及其它一些信息服务 ...
- android 与 服务器通信
android 与 服务器通信 服务端代码: (1)control 层 /** * 用户登录 * @return */ @RequestMapping(value = "/login&quo ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...
- Android原生和H5交互;Android和H5混合开发;WebView点击H5界面跳转到Android原生界面。
当时业务的需求是这样的,H5有一个活动商品列表的界面,IOS和Android共用这一个界面,点击商品可以跳转到Android原生的商品详情界面并传递商品ID: 大概就是点击H5界面跳转到Androi ...
随机推荐
- Cocoapods无法使用/安装失败/失效解决方法
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Helvetica Neue"; color: #666666 } sp ...
- Struts 原理
今天开始接触公司的框架,叫YNA,三个字母应该是雅马哈的缩写,这个框架听公司前辈说功能很强大,但实际上我看不懂.哈哈...... 其中整合了SSH框架,接下来我说下Struts的一些原理 其实这张图就 ...
- spring四种依赖注入方式
一.Set注入 这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringD ...
- GJM : Unity3D 高通Vuforia SDK AR 开发
一.AR概念: 增强现实(Augmented Reality,简称AR),是在虚拟现实的基础上发展起来的新技术,也被称之为混合现实.是通过计算机系统提供的信息增加用户对现实世界感知的技术,将虚拟的信息 ...
- Win7系统卸载McAfee杀毒软件
方法一.用系统正常卸载程序卸载. 首先,在服务里将McAfee相关的所有服务“禁用”. 然后, Windows“控制面板”中的“添加/删除程序”卸载 McAfee Consumer 产品. 接着,到C ...
- 微信小程序社区上线
微信小程序公测了! 从首次得到微信小程序发布的消息开始,小木和Michael就进入了紧急备战状态. 除了要快速学通微信小程序开发之外,我们还做了这些工作: 1.录制全球首套微信小程序实战项目类视频教程 ...
- jQuery.ajax(url,[settings])
概述 通过 HTTP 请求加载远程数据. jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() 返回其创建的 XMLHttpRequest 对象. ...
- 深入理解javascript选择器API系列第二篇——getElementsByClassName
× 目录 [1]使用 [2]classList [3]扩展 前面的话 既然有getElementById()和getElementsByTagName()方法,为什么没有getElementsByCl ...
- Android 绘制view的小知识点
[onMeasure] 直接继承view或ViewGroup的自定义控件需要重写onMeasure方法并设置wrap_content时的自身大小,否则在布局中使用wrap_content就相当于mat ...
- 【转】用JitPack发布开源库时附加文档和源码
来自:http://www.gcssloop.com/course/jitpack-sources-javadoc 用JitPack发布开源库时附加文档和源码 很早之前写过一篇用JitPack发布An ...