Android本地广播的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android本地广播的使用相关的知识,希望对你有一定的参考价值。

参考技术A 为了解决广播的安全性问题,android引入了本地广播机制,使用该机制发出的广播只能在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。

本地广播是无法通过静态注册的方式来接收的。我们知道静态注册主要是为了在程序未启动的情况下能接收广播,而当我们发送本地广播的时候,程序肯定是已经启动的了,所以我们需要动态注册方式创建接收器。
在这里我们创建一个继承于BroadcastReceiver的类LocalReceiver。onReceive()处理你接收到的广播内容,在这里我用Toast来创建一个提示接收到消息的弹窗

在activity_main.xml文件创建一个用于发送广播的按钮

首先通过本地广播管理器LocalBroadcastManager的getInstance()方法获取一个实例,并分别创建过滤器IntentFilter和自定义接收器LocalReceiver的实例。给IntentFilter的实例添加一个action:localbroadcast(接收的广播的名称),然后调用LocalBroadcastManager的registerReceiver()方法进行注册,并将LocalReceiver的实例和IntentFilter的实例都传进去。这样本地监听器就创建完成了。
调用LocalBroadcastManager的sendBroadcast()发送本地广播。运行程序,点击Send Button按钮,我们可以看到弹窗显示“This is in LocalReceiver”,说明本地广播发送和接收成功了。

当然,我们最后一定不要忘了取消注册。我们可以通过调用unregisterReceiver()方法来实现。至此,Android的标准广播发送就完成了。

1.发送的广播只能在本程序内传递,不必担心数据泄露
2.其它程序广播无法发送到本程序的内部,不必担心安全漏洞隐患
3.本地广播比系统全局广播更加高效

在本地测试 UDP 广播

【中文标题】在本地测试 UDP 广播【英文标题】:Test UDP Broadcast locally 【发布时间】:2021-03-31 15:54:05 【问题描述】:

这是一个学校项目,所以我需要使用 UDP 广播。

我正在构建一个仅通过 UDP 使用端口 5000 的 P2P 应用程序。我需要向我网络中的所有客户端发送发现广播数据包。

通常该应用程序将在 Hamachi 上使用,但出于开发目的,我想使用最简单最快的网络环境,因此我想在本地测试多个实例。

我发现可以使用 127.0.0.1 127.0.0.2 等作为本地实例的 IP。 (实际测试了ips从1到6,互相随机发消息)

我现在需要使用相同的 5000 端口,但是做一个广播 UDP

当我在环回接口上调用 ifconfig 时,我没有看到 BROADCAST 选项。

由于显然不可能将 BROADCAST 选项添加到环回接口,因此最简单的方法是:

每个实例 1 个 IP 地址 同一个端口 在本地运行

我应该考虑为此使用 Docker 或 VM 或一些网络模拟器吗?

【问题讨论】:

您是否尝试发送到环回网络 (127.0.0.0/8) 的广播地址 (127.255.255.255)? 广播将仅限于本地广播网络,您可以使用网络广播地址(网络中的最后一个地址)或更常见的方式向本地广播网络上的所有主机广播,255.255.255.255 的有限广播地址将在任何 IPv4 网络上工作(您无需计算网络广播地址)。您可以使用单播测试您的应用程序,但使用有限广播地址进行最终构建。 @RonMaupin 我写了一个快速的 Python 脚本,其中每个脚本都监听 127.0.0.index 并向 ``、<broadcast>127.255.255.255255.255.255.255 发送广播,但没有一个其他脚本得到消息。如果需要,我可以分享代码。 并非所有网络类型都有广播。当然,IEEE 协议(以太网、Wi-Fi、令牌环等)可以,但其他协议(帧中继、ATM 等)不可以。您操作系统中的环回网络似乎是后者之一。 【参考方案1】:

如果您只想向所有客户端广播,也许多播对您来说就足够了。这可以满足您提到的所有三个需求。 Here 是定义,here 是一个小例子可以帮助你。

【讨论】:

您能否澄清group broadcast 的含义?我不熟悉他的术语 对不起,我编辑了我的答案以使其更清楚。希望对你有帮助。 不幸的是,我认为lo0 环回接口也不支持...lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 如果使用多播,你不需要坚持lo0。 如果我不使用lo0,我怎样才能多播到同一台机器上的多个实例(相同的端口,不同的ip)?

以上是关于Android本地广播的使用的主要内容,如果未能解决你的问题,请参考以下文章

Android学习总结——本地广播机制

Android广播的使用(自定义广播和本地广播)

Android四大组件——BroadcastReceiver普通广播有序广播拦截广播本地广播Sticky广播系统广播

Android 发送本地广播 以及创建广播接收器

Android开发——BroadcastReceiver广播的使用

Android四大组件——BroadcastReceiver普通广播有序广播拦截广播本地广播Sticky广播系统广播