Android广播接收pda扫码
注册广播接收器this.main.registerReceiver(this.receiver, this.filter);首先,initScan()的作用是创建意图过滤器filter和接收器receiver;3.使用<input-no-keybord>组件,是在键盘弹出后再隐藏键盘,也不行。:声明“收到广播后谁来处理”------:声明“我要接收哪种广播”------
上次实现pda扫码功能,是通过输入框焦点,获取扫码的内容。但有一个致命问题就是,获取输入框焦点默认会弹出键盘,占据了半屏幕。
试了很多方法,都没法去掉键盘的弹出:
1.

2. disabled 会阻止聚焦,:focus="true" 在小程序/App 端不会生效;
3.使用<input-no-keybord>组件,是在键盘弹出后再隐藏键盘,也不行。
后续发现,pda也属于安卓设备,直接注册扫码动作的广播就可以了
1.查看设备广播码

2.代码
initScan() {
let _this = this;
this.main = plus.android.runtimeMainActivity();
var IntentFilter = plus.android.importClass(
"android.content.IntentFilter"
);
// 意图过滤器
this.filter = new IntentFilter();
this.filter.addAction("android.intent.ACTION_SCAN_OUTPUT");
// 接收器
this.receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
{
onReceive: function (context, intent) {
plus.android.importClass(intent);
let code = intent.getStringExtra("barcode");
console.log("xx11", code);
_this.changeCode(code);
},
}
);
},
startScan() {
try {
// 注册广播接收器
this.main.registerReceiver(this.receiver, this.filter);
} catch (error) {
console.log("error", error);
}
},
stopScan() {
//取消注册 注销
this.main.unregisterReceiver(this.receiver);
},
首先,initScan()的作用是创建意图过滤器filter和接收器receiver;
-
filter(IntentFilter):声明“我要接收哪种广播”------买了哪些快递
-
receiver(BroadcastReceiver):声明“收到广播后谁来处理”------收件人
然后,startScan()的作用是注册广播接收器。stopScan()的作用是取消注册。
注册广播接收器this.main.registerReceiver(this.receiver, this.filter);是通过registerReceiver将this.receiver,和this.filter组合起来。也就是将收件人和她买的快递匹配起来。
代码详解
获取Android应用的主活动(MainActivity)对象
this.main = plus.android.runtimeMainActivity();
- plus.android 是uni-app提供的Android原生API接口
- runtimeMainActivity() 返回当前运行的主活动实例
导入Android的IntentFilter类
var IntentFilter = plus.android.importClass(
"android.content.IntentFilter"
);
- IntentFilter用于定义广播接收器要接收的广播类型
- 这是Android系统级的类,用于处理应用间通信
创建意图过滤器
this.filter = new IntentFilter(); //创建新的IntentFilter实例
this.filter.addAction("android.intent.ACTION_SCAN_OUTPUT"); //添加要监听的广播动作
- "android.intent.ACTION_SCAN_OUTPUT" 是扫码设备发送的广播动作名称
创建广播接收器对象
this.receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
{
onReceive: function (context, intent) {
plus.android.importClass(intent); //导入intent类,用于操作广播数据
let code = intent.getStringExtra("barcode"); //从广播中获取扫码结果,键名为"barcode"
console.log("xx11", code);
_this.changeCode(code); //调用Vue组件的changeCode方法处理扫码结果
},
}
);
- plus.android.implements 实现Android的BroadcastReceiver接口
- onReceive 是接收广播时的回调函数
创建多个IntentFilter对象和receiver接收器,通过registerReceiver组合
一对多:一个 receiver + 一个 filter(多 Action)
多对多:多个 receiver × 多个 filter(任意组合)
生命周期
data() {
return {
receiver: null,
filter: null,
main: null
};
},
onShow() { // 每次页面可见(第一次、返回、后台切回)
this.initScan(); // 里面做“已存在就 return”
this.startScan();
},
onHide() { // 页面不可见(跳路由、按 Home、开弹窗)
this.stopScan();
},
onUnload() { // 页面被销毁(返回上一页、关闭当前页面)
this.stopScan();
},
更详细的Android广播学习Android广播(接收,发送,标准,有序,全局,本地,实战,填坑)_android 广播-CSDN博客
更多推荐


所有评论(0)