Android学习--广播机制

广播机制简介


        Android的广播可以分为两种类型的,标准广播和有序的广播;

        标准广播:  是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎是同一时接收到这条广播。

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

动态注册监听网络变化


      下面通过做一个监听网络变化的例子,好好理解一下广播。

      注册广播的方式有两种,在代码中注册和在AndroidManifest.xml中注册,其中前者也被称为 动态注册 后者也被称为 静态注册。

      那么该如何创建一个广播接收器呢?其实也很简单,让它继承自 BroadcaseReceiver ,并重写父类的 onReceive() 方法就行了,这样当有消息来临的时候onReceive()方法得到执行。具体的接收到广播之后的逻辑就可以在这里处理了。

      1、在getSystemService这个方法里,代码没有截取完整,完整的代码是 context.CONNECTIVITY_SERVICE

      2、系统为了保护用户的隐私安全,是需要我们获取一下网络权限的,这个就是 Androidmanifest.xml 文件中注册

           <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

           注意它和application标签是同级的,不是包含的application标签里面的

静态注册 


      上面我们说的是动态的注册,我们可以看到动态注册广播接收器可以自由的控制它的注册和销毁,很是灵活,但是我们想一下有这样的一个场景,我们的动态注册都是在onCreate()方法里面的,那有没有在程序还没有启动的情况下就能接收到广播呢?答案是当然可以,这就需要我们使用静态注册,也是我们接下来需要写的静态注册。

      它的创建方法如下:

      1、创建的路劲如下   File - New - Other 你就能看到 Broadcast Receiver

      2、Exported 表示是否允许这个广播接收本程序以外的广播

      3、Enable 表示是否启用这个广播

      创建之后我们需要写的代码全都在AndroidManifest.xml中,里面涉及到的问题以及都在下面的代码中:

      另外:我们创建的StaticReceiver里面的代码我们就不看了,也就是一个onReceive方法,有一点需要我们注意的,不管是静态还是动态都需要我们注意的点是:

注意一下,onReceive方法里面不要写过多的逻辑代码或者换进行其他的耗时操作、因为在广播接收器中是不允许开始新的线程的,要是这个方法长时间的没有响应,程序就会报错。

发送广播


      发送广播这里我们就直接看看代码是怎样发送标准广播和有序广播的。

      还要一个本地广播我们代码是写在一起,那本地广播是用来干什么的呢?不知道是否还记得前面我们说的静态注册广播可以接收其他应用程序的广播,这样就降低的程序的安全性,容易引发安全问题!为了解决这个问题,安卓就引入了本地广播的概念,本地广播就是发出的广播只能够在程序的内部进行床底,并且广播接收器也只能来接收来自本应用程序发出的广播,提高了程序的安全性!

     我们这里就只写了注册以及发送,注册这部分就不在写了,还是在我们的onDestroy方法里面注销。

       下面这里还有一点需要我们注意的,就是有序广播发出之后,接收器的优先级的问题,代码如下:

      上面就是我们总结的关于安卓广播通知的问题!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏不想当开发的产品不是好测试

修改chrome插件

背景 例子为:ModHeader插件,顾名思义可以修改request header的插件,官方地址为:https://chrome.google.com/web...

40680
来自专栏Java技术分享

手把手教你用Mysql-Cluster-7.5搭建数据库集群

当你的业务到达一定的当量,肯定需要一定数量的数据库来负载均衡你的数据库请求,我在之前的博客中已经说明了,如何实现负载均衡,但是还有一个问题就是数据同步,因为负载...

56780
来自专栏三木的博客

使用mock来编译和管理RPM软件包

buildroot 在打包时用到的spec文件中包含一些tag,这些对大小写不敏感的tag用冒号来定义。BuildRoot就是其中的一个tag。例如,在libv...

25290
来自专栏Albert陈凯

Linux配置网卡

最简单的vi命令 vi 一个文件名以后 输入i才可以编辑 i 插入 键盘左上角的esc键可以退出 :wq 保存退出 :q! 不保存退出 上下左右可以调整光标 手...

50470
来自专栏散尽浮华

linux下rsync和tar增量备份梳理

前面总结过一篇全量备份/增量备份/差异备份说明,下面介绍下linux下rsync和tar两种增量备份的操作记录: 1)rsync备份 rsync由于本身的特性,...

577100
来自专栏Linux运维学习之路

day2、Linux别名

Linux中修改配置别名 ####用到的命令:   alias 是用来查看系统中有什么别名   source 让配置生效 临时取消别名的方法   unalias...

26680
来自专栏程序小工

【Linux】系统学习Crontab定时任务

crontab 是一个用于设置周期性执行任务的工具。目前服务器端的运行环境大多数为 Linux,在日常的运营和维护中会有很多需要定期执行的操作,其中有些操作是可...

22020
来自专栏加米谷大数据

加米谷:Kafka Connect如何运行管理

上节讲述了Kafka OffsetMonitor:监控消费者和延迟的队列,本节更详细的介绍如何配置,运行和管理Kafka Connect,有兴趣的请关注我们的公...

43370
来自专栏Java技术分享

手把手教你用Mysql-Cluster-7.5搭建数据库集群

当你的业务到达一定的当量,肯定需要一定数量的数据库来负载均衡你的数据库请求,我在之前的博客中已经说明了,如何实现负载均衡,但是还有一个问题就是数据同步,因为负...

28190
来自专栏JavaEdge

Spring Security 实战 - Session管理管理

41130

扫码关注云+社区

领取腾讯云代金券