Uniapp跟原生android插件交互发信息(二)

一、背景

在uni-app开发过程中,有时候会遇到uni-app插件或者提供的api对硬件操作不太友好,需要使用原生Android开发

对应模块,为了使得双方通信方便,特意封装了一个接口,可实现Android与Uni-app互相通讯。

二、内容

做完以下第一、第二部分,即可实现Android与uni-app 互相通信,当然双方通信有不同方式,具体情况具体分析,我的采用的方案是写Android原生插件,在uni-app中集成Android原生插件方式实现。

1、原生Android部分

Android原生涉及到的几个类,MyEvent.java(传递消息的ben类),MyEventManager.java类作用(事件管理器用来处理事件与通知监听器),MyListener.java类,作用接口回调(监听器接口)。由于采用的是uni-app插件方式,故先去uni-app官网下载插件sdk进行开发。详情见最后的代码连接,以下只是例举用的类。

代码

复制代码
public class MyEvent {
 
    //数据
    private Object data;
 
    //事件来源  字符串
    private String source;
 
    //触发对象
    private Object trigger;
 
    private int state;
 
    public MyEvent() {
    }
 
    public MyEvent(Object data) {
        this.data = data;
    }
 
    public Object getTrigger() {
        return trigger;
    }
 
    public void setTrigger(Object trigger) {
        this.trigger = trigger;
    }
 
    public MyEvent(Object data, String source) {
        this.data = data;
        this.source = source;
    }
 
    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;
    }
 
    public int getState() {
        return state;
    }
 
    public void setState(int state) {
        this.state = state;
    }
 
    @Override
    public String toString() {
        return "MyEvent{" +
                "data=" + data +
                ", source='" + source + '\'' +
                ", trigger=" + trigger +
                ", state=" + state +
                '}';
    }
 
}

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

MyListener.java类

复制代码
public interface MyListener extends EventListener {
    void onChange(MyEvent myEvent);
}

BluetoothAndWifi.java类继承UniModule实现插件

复制代码
public class BluetoothAndWifi extends UniModule {
 
    public static int REQUEST_CODE = 1000;//请求码
    public static int REQUEST_BLUETOOTH_CODE = 1001;//请求码
 
    @UniJSMethod(uiThread = false)
    public void sendMsgToUni() {
        MyEventManager.postMsg("==大宝==Android发送给==Uni-app====", "formAndroid");
    }
 
    @UniJSMethod(uiThread = false)
    public void initAndroidEventListner() {
 
        Ted();
    }
 
    @UniJSMethod(uiThread = true)
    public void Ted() {
        Toast.makeText(mWXSDKInstance.getContext(), "==初始化监听AndroidEventListner==", Toast.LENGTH_SHORT).show();
 
        MyEventManager.getMyEventManager().addListener(new MyListener() {
            @Override
            public void onChange(MyEvent myEvent) {
 
                if (myEvent.getSource().trim().equals("fromUni-app") ) {//判断过滤
                    //从uniapp 或者原生传过来的数据
                    Object data = myEvent.getData();
                    Toast.makeText(mWXSDKInstance.getContext(), "==Uni传过来的数据====" + data, Toast.LENGTH_SHORT).show();
                }
 
            }
        }, "fromUni-app");
    }
 
    /**
     * 加法运算
     */
    @UniJSMethod(uiThread = false)
    public void addMathNumber(int a, int b, UniJSCallback callback) {
        callback.invoke(a + b + 9);
    }
 
    /**
     * 原生toast提示
     */
    @UniJSMethod(uiThread = false)
    public void showToast(String msg, UniJSCallback callback) {
        Toast.makeText(mWXSDKInstance.getContext(), msg, Toast.LENGTH_SHORT).show();
        callback.invoke(msg);
    }
 
    /**
     * 原生toast提示
     */
    @UniJSMethod(uiThread = false)
    public void aShowToastOK(String msg, UniJSCallback callback) {
        Toast.makeText(mWXSDKInstance.getContext(), msg, Toast.LENGTH_SHORT).show();
        callback.invoke(msg);
    }
 
    /**
     * 跳转到
     * wifi页面
     */
    @UniJSMethod(uiThread = false)
    public void gotoWifiPage() {
 
        if (mUniSDKInstance != null && mUniSDKInstance.getContext() instanceof Activity) {
            Intent intent = new Intent(mUniSDKInstance.getContext(), WiFiActivity.class);
            ((Activity) mUniSDKInstance.getContext()).startActivityForResult(intent, REQUEST_CODE);
        }
 
    }
 
 
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_CODE && data.hasExtra("respond")) {
//            Log.e("TestModule", "原生页面返回----"+data.getStringExtra("respond"));
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

怎么使用

复制代码
 Android原生部分
 //发送消息
 MyEventManager.postMsg("==大宝==Android发送给==Uni-app====", "formAndroid");//发消息
 
 //初始化监听
      MyEventManager.getMyEventManager().addListener(new MyListener() {
            @Override
            public void onChange(MyEvent myEvent) {
 
                if (myEvent.getSource().trim().equals("fromUni-app") ) {//判断过滤
                    //从uniapp 或者原生传过来的数据
                    Object data = myEvent.getData();
                    Toast.makeText(mWXSDKInstance.getContext(), "==Uni传过来的数据====" + data, Toast.LENGTH_SHORT).show();
                }
 
            }
        }, "fromUni-app");
//"fromUni-app" 标记 必须与发送消息的标记一样
 
 
uni-app部分的代码
 
//获取java类 
let myEventManager = plus.android.importClass("com.xiaoya.mylibrary.business.msg.MyEventManager");
let eventManager = myEventManager.getMyEventManager();
 
let myListener = plus.android.implements("com.xiaoya.mylibrary.business.msg.MyListener", {
                    onChange: function(event) {
                        plus.android.importClass(event);
                        console.log("==日志输出33333==" + event.getData());
                        if (event.getSource() == 'formAndroid') {
 
 
                            andoridModule.showToast(event.getData());
                        }
 
                        //导入类  
 
                        //获取数据  
                        // console.log);  
                        //获取来源  
                        // console.log(event.getSource();  
                    }
                })
 
  // //添加监听器    
  eventManager.addListener("formAndroid", myListener);

msg部分

2、uni-app调用部分

a、代码

html 复制代码
<template>
    <view class="content">
        <input type="number" v-model="a" />
        <input type="number" v-model="b" />
        <button type="default" @click="sendMsgToUni">原生发消息给uni</button>
        <button type="default" @click="add">加法</button>
        <button type="default" @click="openwifi">打开wifi</button>
        <button type="default" @click="openbluetooth">打开蓝牙</button>
        <button type="default" @click="sendMsgToAndroid">Uni发消息给原生</button>
    </view>
</template>
 
<script>
    // 引入插件
    let andoridModule = uni.requireNativePlugin('BluetoothAndWifiPlugin');
 
    let myEventManager = plus.android.importClass("com.xiaoya.mylibrary.business.msg.MyEventManager");
    let eventManager = myEventManager.getMyEventManager();
 
    export default {
        data() {
            return {
                a: 1,
                b: 2
            }
        },
 
        onLoad() {
 
 
        },
 
        onShow() {
            // 初始化原生数据接收监听
            andoridModule.initAndroidEventListner();
            this.initUniListener(); //初始化uni数据接收监听
 
        },
 
 
        methods: {
            // Uni发消息给原生
            sendMsgToAndroid() {
                myEventManager.postMsg("==蘑菇头==发送消息==", "fromUni-app");
            },
            /* 原生发消息给uni */
            sendMsgToUni() {
 
                andoridModule.sendMsgToUni();
            },
            // 初始化Uni监听
            initUniListener() {
                console.log("===日志输出111===" + myEventManager);
                console.log("===日志输出222===" + eventManager);
 
                let myListener = plus.android.implements("com.xiaoya.mylibrary.business.msg.MyListener", {
                    onChange: function(event) {
                        plus.android.importClass(event);
                        console.log("==日志输出33333==" + event.getData());
                        if (event.getSource() == 'formAndroid') {
 
 
                            andoridModule.showToast(event.getData());
                        }
 
                        //导入类  
 
                        //获取数据  
                        // console.log);  
                        //获取来源  
                        // console.log(event.getSource();  
                    }
                })
 
                // //添加监听器    
                eventManager.addListener("formAndroid", myListener);
            },
 
            /*打开蓝牙*/
            openbluetooth() {
                // this.jsCallNativeActivity();
                 
                // andoridModule.goToBluetoothPage();
            },
 
            /*openwifi页面跳转*/
            openwifi() {
 
                // myEventManager.postMsg("app 显示了", "onShow");
                andoridModule.gotoWifiPage();
            },
 
            /**
             * 相加
             */
            add() {
 
                andoridModule.addMathNumber(this.a, this.b, (e) => {
                    andoridModule.showToast('1+B=' + e);
                });
            },
 
        }
 
    }
</script>
 
<style>
    .content {
        padding-top: 200rpx;
    }
</style>

uni-app工程截图

3、最终效果

相关推荐
阳光明媚sunny22 分钟前
Room持久化库中,@Transaction注解的正确使用场景是?
android·数据库
迎風吹頭髮40 分钟前
Linux内核架构浅谈2- Linux内核与硬件交互的底层逻辑:硬件抽象层的作用
linux·架构·交互
我是好小孩1 小时前
【Android】六大设计原则
android·java·运维·服务器·设计模式
VR最前沿4 小时前
外骨骼手套带来了一种仅用手就能与XR进行交互的更自然的方式
科技·交互·xr
铉铉这波能秀6 小时前
如何在Android Studio中使用Gemini进行AI Coding
android·java·人工智能·ai·kotlin·app·android studio
老歌老听老掉牙6 小时前
基于 PyQt5 实现刀具类型选择界面的设计与交互逻辑
python·qt·交互
川石课堂软件测试7 小时前
什么是BUG,你对BUG的了解有多少?
android·linux·服务器·python·功能测试·bug·安全性测试
lingggggaaaa8 小时前
小迪安全学习笔记(一百零二讲)—— 漏扫项目篇&PoC开发&Yaml语法&插件一键生成&匹配结果&交互提取
笔记·学习·安全·网络安全·交互
玩机达人8810 小时前
三星S25Ultra/S24安卓16系统Oneui8成功获取完美root权限+LSP框架
android·linux·里氏替换原则
居安思危_Ho10 小时前
RK平台Uniapp自启动缓存问题解决
android·缓存·uni-app·rk平台·uniapp资源文件