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 ...
随机推荐
- C++ map的基本操作和使用
原文地址:http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可 ...
- java JSP(原创新手可进)
一. 同等编程方式jsp与asp.net的不同 app需要做一个简单网站,和几个用户推广链接,所以涉及到web这块开发,原本昨天想直接使用asp.net来做,但是之后放弃了这个想法,因为数据访问接口都 ...
- java Io流更新文件内容
package com.hp.io; import java.io.FileOutputStream; import java.io.IOException; public class FileOut ...
- glibc 各版本发布时间以及内核默认glibc版本
最近有些软件要求glibc 2.14+,centos 6.x自带的版本是2.12的,特查了下glibc 各版本发布时间以及与对应的内核,如下: Complete glibc release histo ...
- 【web前端面试题整理08】说说最近几次面试(水)
为什么换工作 换工作简单来讲一般会归纳为钱不够或者人不对,我们团队氛围很不错,所以基本就定位到钱不够了,而我更多是考虑到以后的职业发展,简单说来就是对以后几年的工作有想法,而这种想法实现不一定能在现在 ...
- Windows下Python中pip安装Pillow报错总结(转载)
遇到的俩种错误1.ValueError: zlib is required unless explicitly disabled using --disable-zlib, aborting 问题原因 ...
- [转]ASP.NET应用程序生命周期趣谈(五) IIS7瞎说
Ps:建议初学者在阅读本文之前,先简要了解一下之前的几篇文章,以便于熟悉本文提到的一些关于IIS6的内容,方便理解.仅供参考. PS:为什么叫瞎说呢?我觉得自己理解的并不到位,只能是作为一个传声筒,希 ...
- iOS从零开始学习直播之音频1.播放本地音频文件
现在直播越来越火,俨然已经成为了下一个红海.作为一个资深码农(我只喜欢这样称呼自己,不喜欢别人这样称呼我),我必须赶上时代的潮流,开始研究视频直播.发现视屏直播类的文章上来就讲拉流.推流.采集.美 ...
- 豆芽儿 - 高端IT人才成长社区 上线啦!
豆芽儿 - 高端IT人才成长社区 这是我们新打造的网站,全新设计了用户体验,给你更爽快的学习体验.为你分享敏捷开发.项目管理.需求分析.软件设计.UML.中层领导力.CMMI.IT职场等“高大上” ...
- 基于ARM处理器的反汇编器软件简单设计及实现
写在前面 2012年写的毕业设计,仅供参考 反汇编的目的 缺乏某些必要的说明资料的情况下, 想获得某些软件系统的源代码.设计思想及理念, 以便复制, 改造.移植和发展: 从源码上对软件的可靠性和安全性 ...