uni-app Android BroadcastReceiver 动态注册怎么做?PDA 扫码广播接收实战

3 阅读3分钟

在 Android PDA、工业手持机、仓储扫码枪项目里,经常会遇到一种扫码方式:

PDA 扫描条码后,不模拟键盘输入,而是通过 Android Broadcast 广播把扫码结果发送给 App。

如果项目是 uni-app 开发,就需要在 Android 端监听 BroadcastReceiver。

实际开发时,一个比较常见的问题是:

BroadcastReceiver 到底应该静态注册还是动态注册?

对于 PDA 扫码这种场景,我更推荐使用:

动态注册 BroadcastReceiver。

一、PDA 广播扫码的基本流程

整个链路通常是:

PDA 扫描头

系统扫码服务

发送 Broadcast

BroadcastReceiver 接收

读取 Intent Extra

传给 uni-app 页面

业务处理

PDA 厂商通常会提供两个关键参数:

Action

DataKey

例如:

Action:

android.intent.action.SCAN_RESULT

 

DataKey:

barcode

不同厂商并不统一,所以实际值必须根据设备设置或者厂商文档确认。

二、为什么更推荐动态注册?

动态注册最大的优势是可以跟着页面或者插件生命周期走。

例如:

页面进入

→ 注册扫码监听

 

页面退出

→ 注销扫码监听

这样可以避免:

· App 不需要扫码时依然处理广播;

· 多个页面同时监听造成重复回调;

· Receiver 长时间存在;

· 页面销毁以后仍然接收到扫码数据。

尤其是 WMS、ERP、仓库盘点、入库、出库这一类 PDA 项目,经常会有多个扫码页面。

动态注册会更加容易控制。

三、Android 13 以后需要特别注意什么?

Android 新版本对 BroadcastReceiver 的限制越来越严格。

尤其 Android 13、Android 14 以后,如果动态注册 Receiver,需要注意 exported 属性以及系统版本兼容。

因此不要直接把很多年前的 Android 示例复制进新项目。

比较稳妥的做法是:

判断 Android API Version

高版本使用新注册方式

低版本保持兼容方式

如果出现:

低版本 PDA 可以扫码

Android 13 PDA 无法收到广播

第一件事情就应该检查: Receiver注册方式是不是已经不兼容当前Android版本

四、uni-app 页面不要直接承担 Android 广播逻辑

实际项目中,我更建议做一层扫码桥接:

PDA

Android 原生扫码模块

统一 ScanBridge

uni-app

业务页面

而不是每个 Vue 页面自己去监听原生广播。

这样后面接入:

UROVO

东集

优博讯

销邦

霍尼韦尔

新大陆

科密

等不同 PDA 时,只需要修改底层适配层。

业务页面不需要跟着变。

五、实际项目中最容易踩的坑

PDA 广播扫码接入时,我遇到最多的几个问题是:

1. Action 配错;

2. DataKey 配错;

3. PDA 当前配置成 Keyboard 模式;

4. Receiver 没有成功注册;

5. Android 13+ 注册方式不兼容;

6. 页面重复注册导致一次扫码触发多次;

7. 页面退出后没有注销;

8. 中文或者特殊字符编码异常;

9. 连续扫码时业务线程阻塞导致丢数据。

所以排查广播扫码时,不要一开始就怀疑 uni-app。

建议从:

PDA 是否真的发出广播

Action 是否正确

Extra 是否存在

原生层是否收到

JS 层是否收到

业务逻辑是否消费成功

一层一层检查。

很多所谓的“uni-app PDA 扫码失效”,最后其实只是 PDA 的 Action 或 DataKey 配错了。 插件地址:ext.dcloud.net.cn/plugin?id=2…