笔记——broadcast

  1. 在一个IP网络范围中,最大的IP地址是被保留作为广播地址来使用的。比如某个网络的IP范围是192.168.0.XXX,子网掩码是255.255.255.0,那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一网络上的所有端口,这样在该网络中的每台主机都将会收到这条广播。

  2. Android中的广播主要可以分为两种类型:标准广播和有序广播

    • 标准广播:完全异步执行的广播,在广播发出之后,所有的广播接收器机会都会在统一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率比较高,也无法截断。

    • 有序广播:同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。

  3. 不要在onReceive()方法中添加过多的逻辑活着进行任何的耗时操作,因为在广播接收器中是不允许开启线程的,当onReceive()方法运行了较长时间而没有结束时,程序就会报错。因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动一个服务等。

  4. 关于开机广播
    开机广播有稍微的延迟,在用原生的android系统(也就是模拟器)测试的时候,可以收到开机广播,但是大概有5-10秒的延迟;用华为手机测试的时候,如果这个应用没有开启自启动的权限,收不到这个开机的广播,当开启了这个权限之后,可以受到自启动的广播,大概20秒左右的延迟。

  5. 关于广播的属性
    exported属性表示是否允许这个广播接收器接收本程序以外的广播,enabled属性表示是否启用这个广播接收器

  6. android8.0版本,广播在AndroidManifest.xml中注册后发送intent接收不到广播,原因好像是8.0为了管理系统和节约电量特别针对广播和服务发送intent的方式启动做出了改变,也就是说,广播和服务不能随意收intent了,要对广播和服务有更精确的指向,所以在创建intent的时候,我们需要指定我们广播和服务的包名加类名。
    intent.setComponent(new Componentname("com.example.broadcastreceiver","com.example.broadcastreceiver.MY_BROADCAST"));
    ⚠️:如果是动态的注册的广播,不需要这样设置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值