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 ...
随机推荐
- php的面向对象
今天PO一段php的面向对象相关知识吧.面向对象的相关概念和理论知识是很抽象的,要结合现实中的事物来理解,这样有助于类比记忆.还有就是要多接触吧,量变引质变这个应该还是一个硬道理吧,有时候量够了的话, ...
- java多线程解读二(内存篇)
线程的内存结构图 一.主内存与工作内存 1.Java内存模型的主要目标是定义程序中各个变量的访问规则.此处的变量与Java编程时所说的变量不一样,指包括了实例字段.静态字段和构成数组对象的元素,但是不 ...
- jdk源码分析PriorityQueue
一.结构 PriorityQueue是一个堆,任意节点都是以它为根节点的子树中的最小节点 堆的逻辑结构是完全二叉树状的,存储结构是用数组去存储的,随机访问性好.最小堆的根元素是最小的,最大堆的根元素是 ...
- ng-option指令使用记录,设置默认值需要注意
ng-options一般有以下用法: 数组作为数据源: label for value in array select as label for value in array label group ...
- [deviceone开发]-Star分享的几个示例
一.简介 这个是star早期分享的几个示例,都非常实用,包括弹出的菜单,模拟支付密码输入等.初学者推荐.也可以直接使用.二.效果图 三.相关下载 https://github.com/do-proje ...
- no identity found Command /usr/bin/codesign failed with exit code 1 报错解决方法
stackoverflow 的解决方法是 xcode->preference->account->view detail -> refresh the provisioning ...
- 初识Azkaban
先说下hadoop 内置工作流的不足 (1)支持job单一 (2)硬编码 (3)无可视化 (4)无调度机制 (5)无容错机制 在这种情况下Azkaban就出现了 1)Azkaban是什么 Azkaba ...
- MySQL Performance-Schema(二) 理论篇
MySQL Performance-Schema中总共包含52个表,主要分为几类:Setup表,Instance表,Wait Event表,Stage Event表Statement Event表,C ...
- PostgreSQL隐藏字段tableoid
问题来源: 今天群里有人问:tableoid字段在每行都有,而且一个表里面的值是重复的,这样不合理...... 因此做了一些分析: 1)创建了一个表 apple=# \d test_time Tabl ...
- Oracle分区索引
索引与表类似,也可以分区: 分区索引分为两类: Locally partitioned index(局部分区索引) Globally partitioned index(全局分区索引) 下面就来详细解 ...