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 ...
随机推荐
- html5+jqueryMobile编写App推广注册页
html5+jqueryMobile的组合可以直接开发web版的app,所以用到我当前app中的推广注册页的编写是很恰当的,其实只要你熟悉html4+jquery的组合开发,那么html5+jquer ...
- servlet开发中遇到的问题集合
问题1: servlet插入数据库时中文会乱码. 解决方法:在数据库连接地址最后增加两个转码参数(?useUnicode=true&characterEncoding=utf8) url=jd ...
- FunDA(1)- Query Result Row:强类型Query结果行
FunDA的特点之一是以数据流方式提供逐行数据操作支持.这项功能解决了FRM如Slick数据操作以SQL批次模式为主所产生的问题.为了实现安全高效的数据行操作,我们必须把FRM产生的Query结果集转 ...
- swing with transformjs
Antecedent Facebook made a HTML5 game long time ago. The opening animation is a piece of software th ...
- win7 64位下vs不能以管理员身份运行的问题解决
开发机上安装了VS6.0/2008/2010/2013,之前一直是正常的,突然莫名其妙不能以管理员身份运行(除了VS6),报"application cannot start.", ...
- [笔记]linux用户与用户组
sudo useradd -m john 自动建立主目录 sudo passwd john sudo useradd -g groupusers mike sudo useradd -s /bin/b ...
- Cygwin中解决vi编辑器方向键和Backspace键不好使、安装vim的方法
修改.virc文件(如果没有就创建)vi .virc 添加以下内容set nocpset backspace=start,indent,eol 保存退出:wq 如果是vim就修改.vimrc文件. 由 ...
- shell编程常用的截取字符串操作
1. 常用的字符串操作 1.1. 替换字符串:$ echo ${var/ /_}#支持正怎表达式 / /表示搜索到第一个替换,// /表示搜索到的结果全部替换. ...
- MYSQL 导入Excel数据到数据库中
1,先把excel的数据整理整齐,如每列都要保持同样的格式:就一列一列的数据: 2,导出excel的数据为CSV格式,即把excel的数据另存为xxxx.csv;: 3,用EditPlus工具将xxx ...
- 【Linux】AWK入门
什么是AWK AWK是一种用于处理文本的编程语言工具,一个模式匹配程序.一个典型的示例是将数据转换成格式化的报告. 在命令行输入如下awk命令: awk -F":" '{ prin ...