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 ...
随机推荐
- 【微信开发】公众号后台设置错误导致的微信redirect_uri参数错误【图】
在微信开发中,如微信网页授权登录,分享到朋友圈自定义内容,微信h5支付时 可能会遇到微信redirect_uri参数错误的情况. 此时除了检查自己代码正确性外,还要检查一下是否正确地设置了公众号后台的 ...
- spring aop对service层日志和异常的处理
1.aop是什么 AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,与OOP(Object Oriented Programming)面向对象编程对等,都是一种 ...
- 你必须收藏的Github技巧
一秒钟把Github项目变成前端网站 GitHub Pages大家可能都知道,常用的做法,是建立一个gh-pages的分支,通过setting里的设置的GitHub Pages模块可以自动创建该项目的 ...
- JDBC数据库访问操作的动态监测 之 p6spy
P6spy是一个JDBC Driver的包装工具,p6spy通过对JDBC Driver的封装以达到对SQL语句的监听和分析,以达到各种目的. P6spy1.3 sf.net http://sourc ...
- 使用Kotlin对ViewGroup的视图进行函数使操作
原文标题:Functional operations over Views in ViewGroup using Kotlin 原文链接:http://antonioleiva.com/functio ...
- jQuery如何改变css伪元素样式
首先我们看一下css伪元素是什么: CSS 伪元素用于向某些选择器设置特殊效果. 伪元素有哪些: :first-line 伪元素:"first-line" 伪元素用于向文本的首行设 ...
- Xcode7使用插件的简单方法&&以及怎样下载到更早版本的Xcode
Xcode7自2015年9上架以来也有段时间了, 使用Xcode7以及Xcode7.1\Xcode7.2的小伙伴会发现像VVDocumenter-Xcode\KSImageNamed-Xcode\HO ...
- Android中点击隐藏软键盘最佳方法——Android开发之路4
Android中点击隐藏软键盘最佳方法 实现功能:点击EditText,软键盘出现并且不会隐藏,点击或者触摸EditText以外的其他任何区域,软键盘被隐藏: 1.重写dispatchTouchEve ...
- Android笔记——Android自定义控件
目录: 1.自定义控件概述 01_什么是自定义控件 Android系统中,继承Android系统自带的View或者ViewGroup控件或者系统自带的控件,并在这基础上增加或者重新组合成我们想要的效果 ...
- android 之 启动画面的两种方法
现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...