uniappx如何实现原生SDK广播消息并在页面监听

在uniappx中如何实现原生SDK发送广播消息,并在页面中监听这些广播?

具体需求:

  1. 原生端(Android/iOS)通过SDK发送广播消息
  2. uniappx的页面能实时接收到这些广播并处理数据

尝试过uni.$on但无法接收到原生端的广播,是否需要使用plus.android或plus.ios的特定API?求具体实现示例或思路。

2 回复

在UniAppX中实现原生SDK广播消息监听,可以这样操作:

  1. 原生插件开发

    • 在Android端继承UniModule类,使用LocalBroadcastManager发送广播
    • iOS端使用NSNotificationCenter发送通知
  2. 发送广播示例(Android)

Intent intent = new Intent("CUSTOM_ACTION");
intent.putExtra("data", "消息内容");
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
  1. 页面监听

    • onLoad生命周期注册监听
    • onUnload中取消监听
    • 通过回调函数处理接收到的消息
  2. 注意事项

    • 确保广播Action命名唯一
    • 及时销毁监听防止内存泄漏
    • 处理好跨平台兼容性

建议使用uni-app官方推荐的插件开发方式,保证功能稳定性和兼容性。


在 UniApp X 中,可以通过原生插件机制实现 SDK 广播消息的发送与页面监听。以下是实现步骤:

1. 创建原生插件(Android 示例)

nativeplugins 目录创建插件,例如 BroadcastPlugin

Android 原生代码BroadcastPlugin.java):

public class BroadcastPlugin extends DCloudFeatureModule {
    private static final String EVENT_NAME = "onCustomMessage";
    
    @Override
    public void onInitialize(Context context) {
        // 初始化操作
    }
    
    // 发送广播消息的方法
    @UniJSMethod
    public void sendBroadcast(JSONObject data, UniJSCallback callback) {
        // 触发全局事件
        mUniSDKInstance.fireGlobalEventCallback(EVENT_NAME, data);
        callback.invoke("广播发送成功");
    }
}

2. 注册插件

pages.json 中注册插件:

{
  "plugins": {
    "BroadcastPlugin": {
      "type": "module",
      "name": "BroadcastPlugin"
    }
  }
}

3. 页面监听广播消息

在 Vue 页面中使用全局事件监听:

<template>
  <view>
    <text>接收到的消息: {{ message }}</text>
  </view>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  },
  onLoad() {
    // 监听全局事件
    uni.$on('onCustomMessage', (data) => {
      this.message = JSON.stringify(data);
    });
  },
  onUnload() {
    // 移除监听
    uni.$off('onCustomMessage');
  }
}
</script>

4. 触发广播消息

在其他页面或组件中触发广播:

// 获取插件实例
const broadcastModule = uni.requireNativePlugin('BroadcastPlugin');

// 发送广播
broadcastModule.sendBroadcast({
  content: 'Hello UniApp X',
  timestamp: Date.now()
}, (result) => {
  console.log(result);
});

关键点说明:

  1. 原生插件:通过 fireGlobalEventCallback 发送全局事件
  2. 页面监听:使用 uni.$on 监听全局事件
  3. 内存管理:在 onUnload 中及时移除监听避免内存泄漏
  4. 数据类型:支持传递 JSON 对象格式的复杂数据

iOS 实现逻辑类似,需要编写对应的 iOS 原生代码并注册插件。实际开发时建议将广播管理封装成统一的工具类,便于维护和使用。

回到顶部