uni app 打包app 监听广播

文章介绍了如何在PDA设备上使用JavaScript实现对多种广播事件的监听,包括扫码结果,以便于处理不同厂商的设备扫描数据。函数`recive`负责接收广播并处理数据,`unregisterReceiver`用于取消监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pda 设备上用广播监听扫码

可以用于其他广播监听  

var main = null;
var receiver = null;
//接收广播
function recive(success, fail) {

	// #ifdef APP





	main = plus.android.runtimeMainActivity(); //获取activity
	//创建自定义广播实例  
	receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
		onReceive: function(context, intent) { //实现onReceiver回调函数  
			plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作  
			var action = intent.getAction()

			var data
			switch (action) {
				case "com.android.server.scannerservice.broadcast":
					data = intent.getExtra("scannerdata");
					break

				case "android.intent.action.SCANRESULT":
					data = intent.getExtra("value");
					break

				case "android.intent.ACTION_DECODE_DATA":
					data = intent.getExtra("barcode_string");
					break

				case "com.android.provider.sdlmessage":
					data = intent.getExtra("msg");
					break
				case "com.neusoft.action.scanner.read":

					data = intent.getStringExtra("scanner_value"); //东软pda
					if (data == null) {
						data = intent.getStringExtra("Scanner_value"); //东软pda
					}
					break
				case "nlscan.action.SCANNER_RESULT":
					data = intent.getExtra("SCAN_BARCODE1");
					break
				case "com.barcode.sendBroadcast":
					data = intent.getExtra("BARCODE");
					break

				case "scan.rcv.message":


					let barocode = intent.getByteArrayExtra("barocode");
					let barocodelen = intent.getIntExtra("length", 0);
					data = new String(barocode, 0, barocodelen);

					break

				case "xlyk.wz":
					data = intent.getExtra("qrcode");
					break

				case "com.android.scanner.broadcast":
					data = intent.getExtra("scandata");
					break
				case "com.honeywell.scan.broadcast":
					data = intent.getExtra("data");
					break


			}
			if (data) {
				// console.log('zhanglp', data.replace(/\n/, ''))
				// console.log('zhanglp', data.replace(/\n/, '').replace(/\t/, ''))
				success({
					type: 'barcode',
					data: data.replace(/\n/, '').replace(/\t/, '').trim() //处理结束符和换行符为空
				})
			} else {

				fail({
					type: 'barcode',
					data: '未识别到扫码数据' //处理结束符和换行符为空
				})
			}


		}
	});
	var IntentFilter = plus.android.importClass('android.content.IntentFilter'); //网络
	var Intent = plus.android.importClass('android.content.Intent');
	var filter = new IntentFilter(); //过滤





	filter.addAction("com.android.provider.sdlMessage"); //海信
	filter.addAction("com.neusoft.action.scanner.read"); //东软
	filter.addAction("nlscan.action.SCANNER_RESULT"); //新大陆  霍尼韦尔
	filter.addAction("scan.rcv.message"); //南方鸿志
	filter.addAction("com.android.server.scannerservice.broadcast"); //得实2 东大集成  扫码工具密码888888
	filter.addAction("android.intent.action.SCANRESULT"); //得实idata
	//            filter.addAction("com.android.server.scannerservice.broadcast");//东大集成  扫码工具密码888888
	filter.addAction("android.intent.ACTION_DECODE_DATA"); //UROVO  优博讯科
	filter.addAction("com.barcode.sendBroadcast"); //西安富立叶微电子 F760
	filter.addAction("xlyk.wz"); //西安富立叶微电子 F760
	filter.addAction("com.android.scanner.broadcast");
	filter.addAction("com.android.scanner.broadcast");
	filter.addAction("com.honeywell.scan.broadcast");


	main.registerReceiver(receiver, filter); //注册监听
	// #endif
}
//取消监听
function unregisterReceiver() {
	// #ifdef APP
	console.log("取消监听广播")
	main.unregisterReceiver(receiver);
	// #endif
}


module.exports = {
	recive: recive,
	unregisterReceiver: unregisterReceiver
}

使用方法  在监听的页面 加入

import broReceiver from '../../utils/Broadcast.js'

    onShow() {

            broReceiver.recive(function(res) {
                console.log("setting....", JSON.stringify(res))
                 
            }, function(err) {
                console.log("setting....", JSON.stringify(res))
            })


        },

//记得页面隐藏或卸载 关闭监听

onUnload: function() {
            broReceiver.unregisterReceiver()
        },

### 如何在 UniApp 中实现广播接收功能 #### 动态广播机制的概述 动态广播是一种灵活的方式,在运行时通过代码注册和注销广播接收器。这种方式不需要修改 `AndroidManifest.xml` 文件,因此非常适合跨平台框架如 UniApp 的需求[^1]。 --- #### 使用 Vue 特性的 `$eventHub` 实现广播通信 UniApp 基于 Vue.js 构建,可以利用 Vue 提供的全局事件总线(Event Bus)来模拟广播机制。以下是具体实现方法: ##### 创建全局事件总线实例 在项目入口文件(通常是 `main.js` 或单独创建的一个工具类文件中),初始化一个 Vue 实例作为事件总线: ```javascript // main.js const EventHub = new Vue(); export default { install(Vue) { Vue.prototype.$eventHub = EventHub; } }; ``` 这样可以在整个应用范围内访问到这个 `$eventHub` 对象。 --- ##### 发送广播消息 在一个组件中触发广播事件,可以通过 `$emit` 方法向其他组件发送数据。例如: ```javascript methods: { sendBroadcast() { this.$eventHub.$emit('broadcast-event', '这是广播的数据'); } } ``` 上述代码会发出名为 `'broadcast-event'` 的广播,并附带字符串 `'这是广播的数据'` 作为参数[^2]。 --- ##### 接收广播消息 另一个组件可以通过监听指定的广播事件名来接收到该消息。例如: ```javascript created() { this.$eventHub.$on('broadcast-event', (data) => { console.log('接收到广播:', data); // 输出:接收到广播: 这是广播的数据 }); }, beforeDestroy() { this.$eventHub.$off('broadcast-event'); // 销毁前移除监听以防内存泄漏 } ``` 注意:当组件销毁时应调用 `$off` 移除对应的监听函数,以免造成不必要的性能开销或错误行为。 --- #### 结合 Native 插件扩展广播能力 如果需要更接近 Android 原生的行为,则可通过编写插件或者直接操作底层 API 来增强广播功能。比如使用 HBuilderX 工具提供的原生模块支持,定义自定义广播逻辑并封装成统一接口供前端调用。 示例伪代码如下所示: ```javascript import broadcast from './native-broadcast-plugin'; function registerReceiver(callback) { broadcast.register((message) => { callback(message); }); } function unregisterReceiver() { broadcast.unregister(); } registerReceiver((msg) => { console.log(`Native 广播接收到的消息: ${msg}`); }); unregisterReceiver(); // 在适当时候取消订阅 ``` 此方式适用于处理一些特殊场景下的通知传递任务,例如推送服务状态更新、蓝牙设备连接变化等。 --- #### 总结 综上所述,对于简单的页面间通讯推荐优先考虑基于 Vue 的 `$eventHub` 方案;而对于涉及复杂业务流程以及需对接硬件资源的情况则建议引入定制化 native 层解决方案加以辅助完成目标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值