写在20110922:Broadcast

Android广播机制详解
本文详细介绍了Android中的广播机制,包括广播的三种类型:普通广播、有序广播和粘性广播;发送意图的两种形式:显示意图和隐式意图;以及广播接收者的注册方式。此外还讨论了如何处理耗时操作及BroadcastReceiver的生命周期特点。
Broadcast分为三种:
1.普通广播 无序
this.sendBroadcast(i)
this.getContext().sendBroadcast(i, "权限")
2.有序广播 (可以配置有序广播的优先级)
this.getContext().sendOrderedBroadcast(i, null);
3.粘性广播
this.sendStickyBroadcast(i);

广播的发送意图有两种:
1.显示意图 仅一方接收
2.隐式意图 可以多方接收
只需在注册接收者的时候将action设为一样即可
发布者可以//指明接收方需要具备的权限

广播接收者的注册方式有两种
1.声明式注册 AndroidManifestxml
2.编程式注册 .java
接收者可以 permission约束 发送方需要具备的权限

广播主要是进程间通信
当两个或者多个进程发送消息时,广播接收者不需要在线,在三大组件中receiver(广播)的生命周期最短。


广播接受者的响应
每次广播到来时,会重新创建receiver对象,并且调用onReceive()方法,执行完以后,该对象即被销毁.当onReceive()方法在10秒内没有执行完毕,系统会认为该程序无响应.所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No
Response)的对话框。[color=red]如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由Service来完成。这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。[/color]BroadcastReceiver一旦结束,此时BroadcastReceiver的所在进程很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程).如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死.所以采用子线程来解决是不可靠的。
public void onReceive(Context context, Intent intent) {
//发送Intent启动服务,由服务来完成比较耗时的操作
Intent service = new Intent(context, XxxService.class);
context.startService(service);
}
QHostAddress::Broadcast 是 Qt 网络模块中用于表示广播地址的常量。在 UDP(用户数据报协议)通信中,广播是一种将数据发送到网络中所有设备的机制。使用 QHostAddress::Broadcast 可以方便地实现这一功能。 ### 用途 1. **发送广播消息** 在 UDP 通信中,如果需要将数据包发送到本地网络中的所有设备,可以使用 `QHostAddress::Broadcast` 作为目标地址。这通常用于局域网内的设备发现或同步操作。例如,在 `QUdpSocket::writeDatagram()` 方法中,指定目标地址为 `QHostAddress::Broadcast` 并设置适当的端口号即可实现广播功能[^2]。 ```cpp QUdpSocket udpSocket; QByteArray datagram = "Broadcast message"; udpSocket.writeDatagram(datagram, QHostAddress::Broadcast, 45454); ``` 2. **绑定广播地址** 如果需要接收广播消息,通常需要将 `QUdpSocket` 绑定到特定的端口,并且可能需要设置套接字选项以允许广播功能。这可以通过 `QUdpSocket::setSocketOption()` 方法设置 `QAbstractSocket::Broadcast` 选项来实现[^2]。 ```cpp QUdpSocket udpSocket; udpSocket.setSocketOption(QAbstractSocket::Broadcast, 1); udpSocket.bind(45454); ``` 3. **多播与广播的区别** 虽然 `QHostAddress::Broadcast` 用于广播通信,但在某些情况下,可能更倾向于使用多播(Multicast)技术。多播是一种更高效的方式,它允许将数据发送到一组特定的主机,而不是整个网络。Qt 也提供了对多播的支持,例如通过 `QHostAddress::parse()` 解析多播地址,或者使用 `QUdpSocket::joinMulticastGroup()` 加入多播组[^1]。 ### 编程注意事项 - **广播地址的限制** 使用 `QHostAddress::Broadcast` 时,必须确保网络接口支持广播功能,并且防火墙或路由器不会阻止广播流量。通常,广播只能在本地子网内有效,无法跨过路由器传播。 - **端口选择** 在发送或接收广播消息时,需要选择一个合适的端口号。通常,端口号应大于 1024,以避免与系统端口冲突。此外,发送方接收方必须使用相同的端口号才能正确通信。 - **安全性考虑** 由于广播消息会被发送到网络中的所有设备,因此应谨慎使用,以避免对网络性能造成影响或被恶意利用。在某些情况下,可能需要使用加密或身份验证机制来确保通信的安全性。 - **跨平台支持** Qt 的广播功能在大多数平台上都能正常工作,但在某些操作系统(如 Windows)上,可能需要额外的配置或权限来启用广播功能。 ### 示例代码 以下是一个简单的示例,展示如何使用 `QHostAddress::Broadcast` 发送广播消息: ```cpp #include <QCoreApplication> #include <QUdpSocket> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QUdpSocket udpSocket; QByteArray datagram = "Hello, Broadcast!"; qint64 sent = udpSocket.writeDatagram(datagram, QHostAddress::Broadcast, 45454); if (sent == -1) { qDebug() << "Failed to send datagram."; } else { qDebug() << "Datagram sent successfully."; } return a.exec(); } ``` 在这个示例中,程序通过 `QUdpSocket` 发送一个广播消息到端口 `45454`。接收方需要在同一端口监听广播消息。 ### 总结 `QHostAddress::Broadcast` 是 Qt 中用于实现广播通信的重要工具。通过结合 `QUdpSocket` 适当的端口号,可以轻松地在局域网内发送接收广播消息。然而,在使用广播功能时,需要注意网络环境的限制以及可能的安全性问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值