当前位置:   article > 正文

Android与uni-app 互相通信案例(包含源代码)_uniapp串口通信安卓

uniapp串口通信安卓

目录

一、背景

二、内容

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进行开发。详情见最后的代码连接,以下只是例举用的类。

代码

  1. public class MyEvent {
  2. //数据
  3. private Object data;
  4. //事件来源 字符串
  5. private String source;
  6. //触发对象
  7. private Object trigger;
  8. private int state;
  9. public MyEvent() {
  10. }
  11. public MyEvent(Object data) {
  12. this.data = data;
  13. }
  14. public Object getTrigger() {
  15. return trigger;
  16. }
  17. public void setTrigger(Object trigger) {
  18. this.trigger = trigger;
  19. }
  20. public MyEvent(Object data, String source) {
  21. this.data = data;
  22. this.source = source;
  23. }
  24. public Object getData() {
  25. return data;
  26. }
  27. public void setData(Object data) {
  28. this.data = data;
  29. }
  30. public String getSource() {
  31. return source;
  32. }
  33. public void setSource(String source) {
  34. this.source = source;
  35. }
  36. public int getState() {
  37. return state;
  38. }
  39. public void setState(int state) {
  40. this.state = state;
  41. }
  42. @Override
  43. public String toString() {
  44. return "MyEvent{" +
  45. "data=" + data +
  46. ", source='" + source + '\'' +
  47. ", trigger=" + trigger +
  48. ", state=" + state +
  49. '}';
  50. }
  51. }

MyEventManager.java

  1. /**
  2. * 事件管理器
  3. * 用来
  4. * 处理
  5. * 事件
  6. * 与通知
  7. * 监听器
  8. */
  9. public class MyEventManager {
  10. private static MyEventManager myEventManager;
  11. private Map<String, Collection<MyListener>> listeners;
  12. /**
  13. * 不能外部 new
  14. * 实例化
  15. */
  16. private MyEventManager() {
  17. this.listeners = new HashMap<String, Collection<MyListener>>();
  18. }
  19. /**
  20. * 返回监听 总数
  21. *
  22. * @return
  23. */
  24. public int getSize() {
  25. int size = 0;
  26. for (String str : listeners.keySet()) {
  27. size = size + listeners.get(str).size();
  28. }
  29. return size;
  30. }
  31. public Map<String, Collection<MyListener>> getListeners() {
  32. return listeners;
  33. }
  34. /**
  35. * 单例模式
  36. *
  37. * @return
  38. */
  39. public static MyEventManager getMyEventManager() {
  40. if (myEventManager == null) {
  41. synchronized (MyEventManager.class) {
  42. if (myEventManager == null) {
  43. myEventManager = new MyEventManager();
  44. }
  45. }
  46. }
  47. return myEventManager;
  48. }
  49. /***
  50. * 添加事件
  51. * @param listener 事件对象
  52. * @param source 来源
  53. */
  54. public MyListener addListener(MyListener listener, String source) {
  55. if (listener != null && source != null) {
  56. Collection<MyListener> myListeners = listeners.get(source);
  57. if (myListeners == null) {
  58. myListeners = new HashSet<MyListener>();
  59. listeners.put(source, myListeners);
  60. }
  61. myListeners.add(listener);
  62. }
  63. return listener;
  64. }
  65. /***
  66. * 添加事件
  67. * @param source 来源
  68. * @param listener 事件对象
  69. */
  70. public MyListener addListener(String source, MyListener listener) {
  71. return addListener(listener, source);
  72. }
  73. /**
  74. * 移除监听
  75. *
  76. * @param listener
  77. */
  78. public void removeListener(MyListener listener) {
  79. if (listeners == null || listener == null) {
  80. return;
  81. }
  82. //变量所有 找出相同的 删除
  83. for (String str : listeners.keySet()) {
  84. Collection collection = listeners.get(str);
  85. Iterator<MyListener> iter = collection.iterator();
  86. while (iter.hasNext()) {
  87. MyListener next = (MyListener) iter.next();
  88. if (next == listener) {
  89. collection.remove(next);
  90. return;
  91. }
  92. }
  93. }
  94. }
  95. /***
  96. * 发送数据
  97. * @param data 数据
  98. * @param source 来源
  99. * @return
  100. */
  101. public static MyEvent postMsg(Object data, String source) {
  102. MyEventManager myEventManager = MyEventManager.getMyEventManager();
  103. MyEvent myEvent = new MyEvent(data);
  104. myEvent.setSource(source);
  105. if (myEventManager.listeners == null)
  106. return myEvent;
  107. myEventManager.notifyListeners(myEvent, myEvent.getSource());
  108. return myEvent;
  109. }
  110. /**
  111. * 通知所有的myListener
  112. * 相同的 (source) 来源才通知
  113. */
  114. private void notifyListeners(MyEvent event, String source) {
  115. //取出 key为source 的 监听器集合
  116. Collection<MyListener> collection = listeners.get(source);
  117. // Log.i(MyEventManager.class.getName(), source + "--->" + event.getData());
  118. if (collection == null) {
  119. return;
  120. }
  121. //遍历监听器集合
  122. Iterator<MyListener> iter = collection.iterator();
  123. while (iter.hasNext()) {
  124. MyListener next = iter.next();
  125. //通知回调
  126. next.onChange(event);
  127. }
  128. //销毁事件对象
  129. event = null;
  130. }
  131. }

MyListener.java类

  1. public interface MyListener extends EventListener {
  2. void onChange(MyEvent myEvent);
  3. }

BluetoothAndWifi.java类继承UniModule实现插件

  1. public class BluetoothAndWifi extends UniModule {
  2. public static int REQUEST_CODE = 1000;//请求码
  3. public static int REQUEST_BLUETOOTH_CODE = 1001;//请求码
  4. @UniJSMethod(uiThread = false)
  5. public void sendMsgToUni() {
  6. MyEventManager.postMsg("==大宝==Android发送给==Uni-app====", "formAndroid");
  7. }
  8. @UniJSMethod(uiThread = false)
  9. public void initAndroidEventListner() {
  10. Ted();
  11. }
  12. @UniJSMethod(uiThread = true)
  13. public void Ted() {
  14. Toast.makeText(mWXSDKInstance.getContext(), "==初始化监听AndroidEventListner==", Toast.LENGTH_SHORT).show();
  15. MyEventManager.getMyEventManager().addListener(new MyListener() {
  16. @Override
  17. public void onChange(MyEvent myEvent) {
  18. if (myEvent.getSource().trim().equals("fromUni-app") ) {//判断过滤
  19. //从uniapp 或者原生传过来的数据
  20. Object data = myEvent.getData();
  21. Toast.makeText(mWXSDKInstance.getContext(), "==Uni传过来的数据====" + data, Toast.LENGTH_SHORT).show();
  22. }
  23. }
  24. }, "fromUni-app");
  25. }
  26. /**
  27. * 加法运算
  28. */
  29. @UniJSMethod(uiThread = false)
  30. public void addMathNumber(int a, int b, UniJSCallback callback) {
  31. callback.invoke(a + b + 9);
  32. }
  33. /**
  34. * 原生toast提示
  35. */
  36. @UniJSMethod(uiThread = false)
  37. public void showToast(String msg, UniJSCallback callback) {
  38. Toast.makeText(mWXSDKInstance.getContext(), msg, Toast.LENGTH_SHORT).show();
  39. callback.invoke(msg);
  40. }
  41. /**
  42. * 原生toast提示
  43. */
  44. @UniJSMethod(uiThread = false)
  45. public void aShowToastOK(String msg, UniJSCallback callback) {
  46. Toast.makeText(mWXSDKInstance.getContext(), msg, Toast.LENGTH_SHORT).show();
  47. callback.invoke(msg);
  48. }
  49. /**
  50. * 跳转到
  51. * wifi页面
  52. */
  53. @UniJSMethod(uiThread = false)
  54. public void gotoWifiPage() {
  55. if (mUniSDKInstance != null && mUniSDKInstance.getContext() instanceof Activity) {
  56. Intent intent = new Intent(mUniSDKInstance.getContext(), WiFiActivity.class);
  57. ((Activity) mUniSDKInstance.getContext()).startActivityForResult(intent, REQUEST_CODE);
  58. }
  59. }
  60. @Override
  61. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  62. if (requestCode == REQUEST_CODE && data.hasExtra("respond")) {
  63. // Log.e("TestModule", "原生页面返回----"+data.getStringExtra("respond"));
  64. } else {
  65. super.onActivityResult(requestCode, resultCode, data);
  66. }
  67. }

怎么使用

  1. Android原生部分
  2. //发送消息
  3. MyEventManager.postMsg("==大宝==Android发送给==Uni-app====", "formAndroid");//发消息
  4. //初始化监听
  5. MyEventManager.getMyEventManager().addListener(new MyListener() {
  6. @Override
  7. public void onChange(MyEvent myEvent) {
  8. if (myEvent.getSource().trim().equals("fromUni-app") ) {//判断过滤
  9. //从uniapp 或者原生传过来的数据
  10. Object data = myEvent.getData();
  11. Toast.makeText(mWXSDKInstance.getContext(), "==Uni传过来的数据====" + data, Toast.LENGTH_SHORT).show();
  12. }
  13. }
  14. }, "fromUni-app");
  15. //"fromUni-app" 标记 必须与发送消息的标记一样
  16. uni-app部分的代码
  17. //获取java类
  18. let myEventManager = plus.android.importClass("com.xiaoya.mylibrary.business.msg.MyEventManager");
  19. let eventManager = myEventManager.getMyEventManager();
  20. let myListener = plus.android.implements("com.xiaoya.mylibrary.business.msg.MyListener", {
  21. onChange: function(event) {
  22. plus.android.importClass(event);
  23. console.log("==日志输出33333==" + event.getData());
  24. if (event.getSource() == 'formAndroid') {
  25. andoridModule.showToast(event.getData());
  26. }
  27. //导入类
  28. //获取数据
  29. // console.log);
  30. //获取来源
  31. // console.log(event.getSource();
  32. }
  33. })
  34. // //添加监听器
  35. eventManager.addListener("formAndroid", myListener);

msg部分

2、uni-app调用部分

a、代码

  1. <template>
  2. <view class="content">
  3. <input type="number" v-model="a" />
  4. <input type="number" v-model="b" />
  5. <button type="default" @click="sendMsgToUni">原生发消息给uni</button>
  6. <button type="default" @click="add">加法</button>
  7. <button type="default" @click="openwifi">打开wifi</button>
  8. <button type="default" @click="openbluetooth">打开蓝牙</button>
  9. <button type="default" @click="sendMsgToAndroid">Uni发消息给原生</button>
  10. </view>
  11. </template>
  12. <script>
  13. // 引入插件
  14. let andoridModule = uni.requireNativePlugin('BluetoothAndWifiPlugin');
  15. let myEventManager = plus.android.importClass("com.xiaoya.mylibrary.business.msg.MyEventManager");
  16. let eventManager = myEventManager.getMyEventManager();
  17. export default {
  18. data() {
  19. return {
  20. a: 1,
  21. b: 2
  22. }
  23. },
  24. onLoad() {
  25. },
  26. onShow() {
  27. // 初始化原生数据接收监听
  28. andoridModule.initAndroidEventListner();
  29. this.initUniListener(); //初始化uni数据接收监听
  30. },
  31. methods: {
  32. // Uni发消息给原生
  33. sendMsgToAndroid() {
  34. myEventManager.postMsg("==蘑菇头==发送消息==", "fromUni-app");
  35. },
  36. /* 原生发消息给uni */
  37. sendMsgToUni() {
  38. andoridModule.sendMsgToUni();
  39. },
  40. // 初始化Uni监听
  41. initUniListener() {
  42. console.log("===日志输出111===" + myEventManager);
  43. console.log("===日志输出222===" + eventManager);
  44. let myListener = plus.android.implements("com.xiaoya.mylibrary.business.msg.MyListener", {
  45. onChange: function(event) {
  46. plus.android.importClass(event);
  47. console.log("==日志输出33333==" + event.getData());
  48. if (event.getSource() == 'formAndroid') {
  49. andoridModule.showToast(event.getData());
  50. }
  51. //导入类
  52. //获取数据
  53. // console.log);
  54. //获取来源
  55. // console.log(event.getSource();
  56. }
  57. })
  58. // //添加监听器
  59. eventManager.addListener("formAndroid", myListener);
  60. },
  61. /*打开蓝牙*/
  62. openbluetooth() {
  63. // this.jsCallNativeActivity();
  64. // andoridModule.goToBluetoothPage();
  65. },
  66. /*openwifi页面跳转*/
  67. openwifi() {
  68. // myEventManager.postMsg("app 显示了", "onShow");
  69. andoridModule.gotoWifiPage();
  70. },
  71. /**
  72. * 相加
  73. */
  74. add() {
  75. andoridModule.addMathNumber(this.a, this.b, (e) => {
  76. andoridModule.showToast('1+B=' + e);
  77. });
  78. },
  79. }
  80. }
  81. </script>
  82. <style>
  83. .content {
  84. padding-top: 200rpx;
  85. }
  86. </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问答

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/826931
推荐阅读
相关标签
  

闽ICP备14008679号