一、背景

在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;}@Overridepublic 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() {@Overridepublic 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);}}@Overridepublic 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() {@Overridepublic 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

https://ask.dcloud.net.cn/article/id-36187

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

  1. Android 高仿App项目归纳整理,持续更新中…

    Android 高仿App项目归纳整理,持续更新中- Android高仿App项目整理,包含高仿了一些大公司的app,有基于Java,Kotlin,Flutter等语言的.对于开发我们自已的项目时可以 ...

  2. android 电商app组件化,APICloud AVM多端开发案例深度解析(一)--生鲜电商app开发

    AVM多端开发是APICloud定义的一套新的代码编写标准(DSL):基于标准Web Components组件化思想,兼容Vue / React语法特性,通过一次编码,分别编译为Android和iOS ...

  3. vue组件通信案例练习(包含:父子组件通信及平行组件通信)

    文章目录 一.案例概述 二.代码 准备工作: 案例1.1:父组件向子组件传值(或者叫:子组件使用父组件属性),采用v-bind方式实现 案例1.2:子组件向父组件传值(或者叫:子组件调用父组件方法), ...

  4. 蓝牙App设计2:使用Android Studio制作一个蓝牙软件(包含:代码实现等)

    前言:蓝牙聊天App设计全部有三篇文章(一.UI界面设计,二.蓝牙搜索配对连接实现,三.蓝牙连接聊天),这篇文章是:二.蓝牙搜索配对连接实现. 课程1:Android Studio小白安装教程,以及第 ...

  5. Android http通信案例

    Android studio 编写安卓程序,实现 http 通信,获得百度主页源代码. -------------------------------------------------------- ...

  6. Android利用Socket与硬件通信之智能家居APP

    Android利用Socket与硬件通信之智能家居APP - JCLovebiancheng - 博客园 在socket使用时,可以用1024-65535的端口号

  7. 手机APP开发之MIT Appinventor详细实战教程(一),利用通过蓝牙控制单片机,以及实现单片机与android设备之间的串口通信

    目录 (一)前期软件准备和硬件准备 ( 二 ) 实现的思路和操作原理 ( 三) 具体的操作方法 MIT Appinventor 是编程领域较为受欢迎且适用的编程软件 ,因其操作流程和使用方法简单,一直 ...

  8. 自由Android安全研究员陈愉鑫:移动App灰色产业案例分析与防范

    11月18号,2017看雪安全开发者峰会在北京悠唐皇冠假日酒店举行.来自全国各地的开发人员.网络安全爱好者及相应领域顶尖专家,在2017看雪安全开发者峰会汇聚一堂,只为这场"安全与开发&qu ...

  9. android广播不同app,用广播(Broadcast)实现不同app之间的通信

    Android中广播类型可以分为2种,一种是系统的自动广播,比说说:电量偏低,网络状态改变,系统时间改变等等.另外一种是我们自己自定义的广播,这种就最常见了. 系统发送来的广播可以被我们自己的或是第三 ...

  10. Android uni app 列表底部白条解决方案

    uni app中android打开本地vue的列表会发现,底部有条白边. vue通过uni.getSystemInfoSync();方法获取系统信息,首次取值对,再次取值就出错 uni app每次启动 ...

最新文章

  1. JWT 和 JJWT,别再傻傻分不清了!
  2. HTTP Content-Type类型
  3. iOS开发之单例模式
  4. The _imagingft C module is not installed
  5. saltstack 实验(小弟不才)
  6. centos 6.5 x64安装php 7
  7. 基于SSM疫情信息爬取与分析系统
  8. Docker报错:Temporary failure in name resolutionProxy Authentication Required
  9. 学生激活windows,Visio等软件的正确姿势
  10. 第四套人民币及8001的简介
  11. 树莓派 安装谷歌拼音输入法(树莓派官方版系统、基于Debian)
  12. UWP—网易云音乐的APP分析
  13. rational rose导出sql脚本
  14. python自动化操作微信_利用Python实现微信半自动化操作!
  15. String的intern()方法浅析
  16. 企业品牌营销型网站搭建需要关注这6大核心要素
  17. 化繁为简,我用”知晓推送”开发微信小程序订阅消息
  18. endNote操作教程-2-文献导入到endNote
  19. rono在oracle的作用_oracle分区表有什么作用
  20. html登录cdn,html cdn

热门文章

  1. elasticsearch7.x clusterAPI之settings
  2. 读书笔记-----跟任何人都聊得来
  3. 公共计算机课的价值取向是什么意思,提问:1、新课改与新课程标准的价值取向是什么?...
  4. 免费拿走Vivado2017.4安装包及其license(附带安装教程)
  5. Java课程设计项目 客户信息管理软件 客户信息管理系统的实现
  6. IT人必看!2018年上半年云栖大会300份干货PPT免费开放!最前沿的技术都在这了!
  7. C语言数据结构学生成绩 顺序表
  8. 用Excel建立一个学生成绩表,包括学号、姓名、高数、英语,计算机,总分
  9. ATSHA204芯片手册阅读笔记
  10. 爬虫练习3 爬取堆糖网校花照片