安卓主动发数据到uniapp界面

业务场景:

安卓原生混合app(uniapp),当安卓的sdk有数据回调的时候,uniapp那边怎么实时获取到呢?不是只能通过调用函数的方式获取回调结果的,还有另一种方法,就是使用监听。

在uniapp的页面,我们可以建立监听:

javascript 复制代码
			let myEventManager = plus.android.importClass('com.clj.fastble.MyEventManager');
			this.eventManager = myEventManager.getMyEventManager();
			
			//新建监听器
			this.myListener = plus.android.implements('com.clj.fastble.MyListener', {
				onChange: function(event) {
					//获取数据
					//导入类
					plus.android.importClass(event);
					console.log(event.getData(), '=====');
				}
			});
			
			//添加监听器
			this.eventManager.addListener('onShowXX', this.myListener);

在安卓代码那里,创建对应的监听:
MyEvent.java

java 复制代码
public class MyEvent  {

    //数据
    private  Object data;

    //事件来源  字符串
    private  String source;

    //触发对象
    private  Object  trigger;

    public MyEvent(Object data) {
        this.data = data;
    }

    public Object getTrigger() {
        return trigger;
    }

    @Override
    public String toString() {
        return "MyEvent{" +
                "data=" + data +
                ", source='" + source + '\'' +
                ", trigger=" + trigger +
                '}';
    }

    public void setTrigger(Object trigger) {
        this.trigger = trigger;
    }

    public MyEvent(Object data, String source) {
        this.data = data;
        this.source = source;
    }

    public MyEvent() {
    }

    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;
    }
}

MyListener.java

java 复制代码
import java.util.EventListener;

public  interface MyListener  extends EventListener {
    void onChange(MyEvent myEvent);
}

MyEventManager.java

java 复制代码
/***
 * 自定义事件管理类
 */
public class MyEventManager {
    private static MyEventManager myEventManager;

    private Map<String, Collection<MyListener>> listeners;

    /**
     * 不能外部 new  实例化
     */
    private MyEventManager() {
        this.listeners = new HashMap<String, Collection<MyListener>>();
    }

    /**
     * 返回监听 总数
     *
     * @return
     */

    public int getSize() {
        int size = 0;
        for (String str : listeners.keySet()) {
            size = size + listeners.get(str).size();

        }
        return size;
    }

    public Map<String, Collection<MyListener>> getListeners() {

        return listeners;
    }

    /**
     * 单例模式
     *
     * @return
     */
    public static MyEventManager getMyEventManager() {
        if (myEventManager == null) {
            synchronized (MyEventManager.class) {
                if (myEventManager == null) {
                    myEventManager = new MyEventManager();
                }
            }
        }
        return myEventManager;
    }

    /***
     * 添加事件
     * @param listener    事件对象
     * @param source      来源
     */
    public MyListener addListener(MyListener listener, String source) {

        if (listener != null && source != null) {
            Collection<MyListener> myListeners = listeners.get(source);

            if (myListeners == null) {
                myListeners = new HashSet<MyListener>();
                listeners.put(source, myListeners);
            }
            myListeners.add(listener);

        }
        return listener;

    }

    /***
     * 添加事件
     *  @param source      来源
     * @param listener    事件对象
     */
    public MyListener addListener(String source, MyListener listener) {

        return addListener(listener, source);

    }

    /**
     * 移除监听
     *
     * @param listener
     */
    public  void removeListener(MyListener listener) {
        if (listeners == null || listener == null) {
            return;
        }

        //变量所有  找出相同的  删除
        for (String str : listeners.keySet()) {

            Collection collection = listeners.get(str);
            Iterator<MyListener> iter = collection.iterator();
            while (iter.hasNext()) {
                MyListener next = (MyListener) iter.next();
                if (next == listener) {
                    collection.remove(next);
                    return;
                }
            }
        }

    }

    /***
     *   发送数据
     * @param data   数据
     * @param source 来源
     * @return
     */
    public static MyEvent postMsg(Object data, String source) {
        MyEventManager myEventManager = MyEventManager.getMyEventManager();
        MyEvent myEvent = new MyEvent(data);
        myEvent.setSource(source);
        if (myEventManager.listeners == null)

            return myEvent;
        myEventManager.notifyListeners(myEvent, myEvent.getSource());
        return myEvent;
    }

    /**
     * 通知所有的myListener    相同的 (source) 来源才通知
     */
    private void notifyListeners(MyEvent event, String source) {

        //取出  key为source 的  监听器集合
        Collection<MyListener> collection = listeners.get(source);

//        Log.i(MyEventManager.class.getName(), source + "--->" + event.getData());

        if (collection == null) {
            return;
        }
        //遍历监听器集合
        Iterator<MyListener> iter = collection.iterator();
        while (iter.hasNext()) {
            MyListener next = iter.next();
            //通知回调
            next.onChange(event);
        }

        //销毁事件对象
        event = null;
    }

}

使用方式:

在需要推送的位置使用

java 复制代码
 MyEventManager.postMsg("一粒程序米","onShowXX");//刺激强度

这样,前端那边打印店结果就是

javascript 复制代码
一粒程序米,=====

当然,也要记得移除监听,当不需要这个监听的时候,就移除

在uniapp那边

javascript 复制代码
	beforeDestroy() {
		this.eventManager.removeListener(this.myListener);
	},

学会了吗

相关推荐
Mr_li2 小时前
给 Vue 开发者的 uni-app 快速指南
vue.js·uni-app
anyup5 小时前
🔥2026最推荐的跨平台方案:H5/小程序/App/鸿蒙,一套代码搞定
前端·uni-app·harmonyos
阿巴斯甜8 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker8 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95279 小时前
Andorid Google 登录接入文档
android
黄林晴10 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android