在一个IP网络范围中,最大的IP地址是被保留作为广播地址来使用的。比如某个网络的IP范围是192.168.0.XXX,子网掩码是255.255.255.0,那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一网络上的所有端口,这样在该网络中的每台主机都将会收到这条广播。
Android中的广播主要可以分为两种类型:标准广播和有序广播
标准广播:完全异步执行的广播,在广播发出之后,所有的广播接收器机会都会在统一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率比较高,也无法截断。
有序广播:同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
不要在onReceive()方法中添加过多的逻辑活着进行任何的耗时操作,因为在广播接收器中是不允许开启线程的,当onReceive()方法运行了较长时间而没有结束时,程序就会报错。因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动一个服务等。
关于开机广播
开机广播有稍微的延迟,在用原生的android系统(也就是模拟器)测试的时候,可以收到开机广播,但是大概有5-10秒的延迟;用华为手机测试的时候,如果这个应用没有开启自启动的权限,收不到这个开机的广播,当开启了这个权限之后,可以受到自启动的广播,大概20秒左右的延迟。关于广播的属性
exported属性表示是否允许这个广播接收器接收本程序以外的广播,enabled属性表示是否启用这个广播接收器android8.0版本,广播在AndroidManifest.xml中注册后发送intent接收不到广播,原因好像是8.0为了管理系统和节约电量特别针对广播和服务发送intent的方式启动做出了改变,也就是说,广播和服务不能随意收intent了,要对广播和服务有更精确的指向,所以在创建intent的时候,我们需要指定我们广播和服务的包名加类名。
intent.setComponent(new Componentname("com.example.broadcastreceiver","com.example.broadcastreceiver.MY_BROADCAST"));
⚠️:如果是动态的注册的广播,不需要这样设置
笔记——broadcast
最新推荐文章于 2023-11-09 23:29:16 发布