在 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…