Android与uni-app 互相通信案例(包含源代码)

目录

一、背景

二、内容

1、原生Android部分

2、uni-app调用部分

3、最终效果

4、代码地址


一、背景

在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、代码


<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、最终效果

4、代码地址

代码还包含其他功能,例如uni-app调用

Android原生代码

https://download.csdn.net/download/shi450561200/87383612

uni-app代码

https://download.csdn.net/download/shi450561200/87383617

安卓原生与uniapp 互相通讯 (原生发送数据给uniapp uniapp 发送数据给原生) - DCloud问答

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
uni-app中进行串口通信接收文件的代码格式会依赖于你所选择的串口通信插件或原生插件的具体实现方式。以下是一个示例代码,供参考: ```javascript // 导入串口通信插件 import SerialPortPlugin from 'serial-port-plugin'; // 打开串口,配置参数 SerialPortPlugin.open({ port: '/dev/ttyS0', // 串口设备路径 baudRate: 9600, // 波特率 dataBits: 8, // 数据位 stopBits: 1, // 停止位 parity: 'none' // 校验位 }); // 监听串口数据接收事件 SerialPortPlugin.onDataReceived((data) => { // 在这里处理接收到的数据 // 根据文件传输协议解析数据包,并组装成完整的文件 // 假设接收到的数据已经组装成完整的文件,保存到本地 uni.saveFile({ tempFilePath: 'data://' + filename, // 文件路径 success(res) { uni.showToast({ title: '文件保存成功', icon: 'success', duration: 2000 }); }, fail(err) { uni.showToast({ title: '文件保存失败', icon: 'none', duration: 2000 }); } }); }); ``` 上述代码中使用了一个名为`SerialPortPlugin`的串口通信插件,它提供了打开串口、配置参数、监听数据接收等功能。根据你所选择的插件或原生插件,代码的具体实现方式可能会有所不同。你需要根据插件的文档和示例代码来正确调用相关方法。 在数据接收的回调函数中,可以根据所选择的文件传输协议解析数据包,并将数据包组装成完整的文件。这里的代码仅展示了文件保存的示例,你可以根据实际需求来处理接收到的数据。 需要注意的是,具体的串口通信插件和实现方式可能因设备和平台而异。因此,在使用插件之前,请确保该插件适用于你的设备和平台,并按照插件提供的文档进行正确配置和调用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值