Android与uni-app 互相通信案例(包含源代码)
一、背景
在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 互相通信案例(包含源代码)相关推荐
- Android 高仿App项目归纳整理,持续更新中…
Android 高仿App项目归纳整理,持续更新中- Android高仿App项目整理,包含高仿了一些大公司的app,有基于Java,Kotlin,Flutter等语言的.对于开发我们自已的项目时可以 ...
- android 电商app组件化,APICloud AVM多端开发案例深度解析(一)--生鲜电商app开发
AVM多端开发是APICloud定义的一套新的代码编写标准(DSL):基于标准Web Components组件化思想,兼容Vue / React语法特性,通过一次编码,分别编译为Android和iOS ...
- vue组件通信案例练习(包含:父子组件通信及平行组件通信)
文章目录 一.案例概述 二.代码 准备工作: 案例1.1:父组件向子组件传值(或者叫:子组件使用父组件属性),采用v-bind方式实现 案例1.2:子组件向父组件传值(或者叫:子组件调用父组件方法), ...
- 蓝牙App设计2:使用Android Studio制作一个蓝牙软件(包含:代码实现等)
前言:蓝牙聊天App设计全部有三篇文章(一.UI界面设计,二.蓝牙搜索配对连接实现,三.蓝牙连接聊天),这篇文章是:二.蓝牙搜索配对连接实现. 课程1:Android Studio小白安装教程,以及第 ...
- Android http通信案例
Android studio 编写安卓程序,实现 http 通信,获得百度主页源代码. -------------------------------------------------------- ...
- Android利用Socket与硬件通信之智能家居APP
Android利用Socket与硬件通信之智能家居APP - JCLovebiancheng - 博客园 在socket使用时,可以用1024-65535的端口号
- 手机APP开发之MIT Appinventor详细实战教程(一),利用通过蓝牙控制单片机,以及实现单片机与android设备之间的串口通信
目录 (一)前期软件准备和硬件准备 ( 二 ) 实现的思路和操作原理 ( 三) 具体的操作方法 MIT Appinventor 是编程领域较为受欢迎且适用的编程软件 ,因其操作流程和使用方法简单,一直 ...
- 自由Android安全研究员陈愉鑫:移动App灰色产业案例分析与防范
11月18号,2017看雪安全开发者峰会在北京悠唐皇冠假日酒店举行.来自全国各地的开发人员.网络安全爱好者及相应领域顶尖专家,在2017看雪安全开发者峰会汇聚一堂,只为这场"安全与开发&qu ...
- android广播不同app,用广播(Broadcast)实现不同app之间的通信
Android中广播类型可以分为2种,一种是系统的自动广播,比说说:电量偏低,网络状态改变,系统时间改变等等.另外一种是我们自己自定义的广播,这种就最常见了. 系统发送来的广播可以被我们自己的或是第三 ...
- Android uni app 列表底部白条解决方案
uni app中android打开本地vue的列表会发现,底部有条白边. vue通过uni.getSystemInfoSync();方法获取系统信息,首次取值对,再次取值就出错 uni app每次启动 ...
最新文章
- JWT 和 JJWT,别再傻傻分不清了!
- HTTP Content-Type类型
- iOS开发之单例模式
- The _imagingft C module is not installed
- saltstack 实验(小弟不才)
- centos 6.5 x64安装php 7
- 基于SSM疫情信息爬取与分析系统
- Docker报错:Temporary failure in name resolutionProxy Authentication Required
- 学生激活windows,Visio等软件的正确姿势
- 第四套人民币及8001的简介
- 树莓派 安装谷歌拼音输入法(树莓派官方版系统、基于Debian)
- UWP—网易云音乐的APP分析
- rational rose导出sql脚本
- python自动化操作微信_利用Python实现微信半自动化操作!
- String的intern()方法浅析
- 企业品牌营销型网站搭建需要关注这6大核心要素
- 化繁为简,我用”知晓推送”开发微信小程序订阅消息
- endNote操作教程-2-文献导入到endNote
- rono在oracle的作用_oracle分区表有什么作用
- html登录cdn,html cdn
热门文章
- elasticsearch7.x clusterAPI之settings
- 读书笔记-----跟任何人都聊得来
- 公共计算机课的价值取向是什么意思,提问:1、新课改与新课程标准的价值取向是什么?...
- 免费拿走Vivado2017.4安装包及其license(附带安装教程)
- Java课程设计项目 客户信息管理软件 客户信息管理系统的实现
- IT人必看!2018年上半年云栖大会300份干货PPT免费开放!最前沿的技术都在这了!
- C语言数据结构学生成绩 顺序表
- 用Excel建立一个学生成绩表,包括学号、姓名、高数、英语,计算机,总分
- ATSHA204芯片手册阅读笔记
- 爬虫练习3 爬取堆糖网校花照片