当前位置: 代码迷 >> 综合 >> android端与H5端数据交互
  详细解决方案

android端与H5端数据交互

热度:70   发布时间:2024-02-12 10:13:12.0

由于最近app需要做消息通知,所以事件需要经过android发给h5界面进行数据更新.

一.android代码:

public class MacrosanEvent {//数据private  Object data;//事件来源  字符串private  String source;//触发对象private  Object  trigger;public MacrosanEvent(Object data) {this.data = data;}public static MacrosanEventManager getMacrosanEventManager() {return MacrosanEventManager.getMsEventManager();}public Object getTrigger() {return trigger;}@Overridepublic String toString() {return "MyEvent{" +"data=" + data +", source='" + source + '\'' +", trigger=" + trigger +'}';}public void setTrigger(Object trigger) {this.trigger = trigger;}public MacrosanEvent(Object data, String source) {this.data = data;this.source = source;}public MacrosanEvent() {}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public String getSource() {return source;}public void setSource(String source) {this.source = source;}
}

import android.util.Log;import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;public class MacrosanEventManager {private static MacrosanEventManager myEventManager;private Map<String, Collection<MacrosanListener>> listeners;/*** 不能外部 new  实例化*/private MacrosanEventManager() {this.listeners = new HashMap<>();}/*** 返回监听 总数** @return*/public int getSize() {int size = 0;for (String str : listeners.keySet()) {size = size + listeners.get(str).size();}return size;}public Map<String, Collection<MacrosanListener>> getListeners() {return listeners;}/*** 单例模式** @return*/public static MacrosanEventManager getMsEventManager() {if (myEventManager == null) {synchronized (MacrosanEventManager.class) {if (myEventManager == null) {myEventManager = new MacrosanEventManager();}}}return myEventManager;}/**** 添加事件* @param listener    事件对象* @param source      来源*/public MacrosanListener addListener(MacrosanListener listener, String source) {if (listener != null && source != null) {Collection<MacrosanListener> myListeners = listeners.get(source);if (myListeners == null) {myListeners = new HashSet<>();listeners.put(source, myListeners);}myListeners.add(listener);}return listener;}/**** 添加事件*  @param source      来源* @param listener    事件对象*/public MacrosanListener addListener(String source, MacrosanListener listener) {return addListener(listener, source);}/*** 移除监听** @param listener*/public void removeListener(MacrosanListener listener) {if (listeners == null || listener == null) {return;}//变量所有  找出相同的  删除for (String str : listeners.keySet()) {Collection collection = listeners.get(str);Iterator<MacrosanListener> iter = collection.iterator();while (iter.hasNext()) {MacrosanListener next = (MacrosanListener) iter.next();if (next == listener) {collection.remove(next);return;}}}}/****   发送数据* @param data   数据* @param source 来源* @return*/public static MacrosanEvent postMsg(Object data, String source) {MacrosanEventManager myEventManager = MacrosanEventManager.getMsEventManager();MacrosanEvent myEvent = new MacrosanEvent(data);myEvent.setSource(source);if (myEventManager.listeners == null)return myEvent;myEventManager.notifyListeners(myEvent, myEvent.getSource());return myEvent;}/*** 通知所有的myListener    相同的 (source) 来源才通知*/private void notifyListeners(MacrosanEvent event, String source) {//取出  key为source 的  监听器集合Collection<MacrosanListener> collection = listeners.get(source);Log.i(MacrosanEventManager.class.getName(), source + "--->" + event.getData());if (collection == null) {return;}//遍历监听器集合Iterator<MacrosanListener> iter = collection.iterator();while (iter.hasNext()) {MacrosanListener next = iter.next();//通知回调next.onChange(event);}//销毁事件对象event = null;}
}

import java.util.EventListener;public interface MacrosanListener extends EventListener {void onChange(MacrosanEvent msEvent);
}

发送数据代码:

  MacrosanEventManager.postMsg(数据,"h5约定方法名称");
eg:  MacrosanEventManager.postMsg(jsonModel,"websocket-event");

接收数据代码:

public class RefreshListener implements MacrosanListener {private static final String TAG = "RefreshListener";@Overridepublic void onChange(MacrosanEvent myEvent) {//从uniapp/h5或者原生传过来的数据String  data = myEvent.getData().toString();}
}
 再MainActivity中编写MacrosanEventManager.getMsEventManager().addListener(new RefreshListener(), "与h5约定方法名");//和发送数据方法名称不一样eg:
MacrosanEventManager.getMsEventManager().addListener(new RefreshListener(), "websocket-event1");

二.H5端代码:

我是直接写了一个组件注册到首页,下面是组件内容:

/**
* 安卓通信器。
*/
<template>
</template><script>export default {data() {return {}},computed: {devices: function() {return this.$store.state.ipInfo.ipInfos;}},methods: {postMsg: function(data, source) {this.msEventManager.postMsg(data, source);},getMsg: function() {let androidPackage = "XXXXX安卓包名";
;this.msEventManager = plus.android.importClass(androidPackage + ".MacrosanEventManager");this.eventManager = this.msEventManager.getMsEventManager();let self = this;//新建监听器  this.msListener = plus.android.implements(androidPackage + ".MacrosanListener", {onChange: function(event) {plus.android.importClass(androidPackage + ".MacrosanEvent");//获取数据let messages = event.getData();}})//添加监听器    this.eventManager.addListener("websocket-event", this.msListener);}},mounted() {let self = this;if (window.plus) {// 在这里调用5+ API this.getMsg();} else { // 兼容老版本的plusready事件 document.addEventListener('plusready', function() {// 在这里调用5+ APIself.getMsg();}, false);}},watch: {devices: function(nv, ov) {this.postMsg(JSON.stringify(nv), "websocket-event1");}}}
</script><style>
</style>

这样就大功告成了

注:遇到一个特别坑的地方,有的方法名称不生效,目前没找到原因,如果交互失败,代码也确定没问题,将约定方法名称修改下可能会成功

  相关解决方案