Android学习笔记之广播机制

(学习参考书:第一行代码第2版)

一、广播机制简介

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

标准广播:是一种完全异步执行的广播,在广播发出后,所有的广播接收器都会在同一时刻接收到这条广播。这种广播效率高,但是它无法被切断。

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

二、接收系统广播

(1)动态注册
广播接收器可以自由的对自己感兴趣的广播进行注册,这样当有相应广播发出时,广播接收器就能够接收到该广播,并在内部处理相应的逻辑。注册广播的方式一般有两种:在代码中注册(动态注册)、在AndroidManifest.xml中注册(静态注册)。
创建一个广播接收器的方法:新建一个类,让其继承BroadcastReceiver,并重写父类的onReceive()方法。
当有广播到来时,onReceive()方法会得到执行,具体的逻辑就可以在该方法中处理。
动态注册具体实现方法

  1. 在活动定义一个类,继承BoradcastReceiver,重写父类的onReceive()方法。即创建广播接收器。
  2. 在onCreate方法中创建一个IntentFilter的实例,并且调用addAction()给它添加有一个值,这个值就是系统发出的广播。即广播接收器想要监听什么广播,就要添加相应的action。
  3. 注册广播接收器的实例。
  4. 调用registerReceiver()方法,传入广播接收器和IntentFilter的实例,这样当广播接收器接收到指定值的广播时,就会执行onRecevie方法
  5. 动态注册的广播接收器都要取消注册才行,可以在onDestory()方法中通过调用unregisterReceiver()方法来实现。

2)静态注册
动态注册的广播接收器可以自由控制注册和注销,在灵活性方面有很大的优势,但存在一个缺点,即必须要程序启动后才能接收到广播,因为注册的逻辑写在onCreate()方法中。如果想在程序未启动时就能接收到广播,就需要静态注册发方法了。
静态广播接收器一定要在AndroidManifest.xml中注册才可以使用。使用Android Studio可以自动创建并注册。

<receiver
    android:name=".BootCompleteReceiver"
    android:enabled="true"
    android:exported="true">
</receiver>

所有的静态广播接收器都在<receiver>标签中注册,它有两个属性:

android:enabled 是否允许这个广播接收器接收本程序以外的广播
android:exported 是否启用这个广播接收器

然后在<receiver>标签下添加<intent-filter>标签,并往里面添加需要监听的action,如此以来便完成了广播接收器的静态注册。

注意:不要在onReceive方法中添加过多的操作逻辑或进行任何耗时操作,因为广播接收器中不允许开启线程,当该方法运行较长时间没有结束时,程序就会报错。因此广播接收器更多的是扮演一种打开程序其他组件的角色。

三、发送自定义广播

(1)发送标准广播

  1. 定义一个广播接收器。
  2. 如果选择静态创建,在AndroidManifest//标签下添加自定义的action。
  3. 在发出广播的活动中创建Intent,构造方法传入参数与第2点添加的action一致。
  4. Intent对象调用setComponent(new ComponentName(“广播接收器包路径”,”广播接收器类的路径”))方法。
  5. 调用sendBroadcast(intent)方法将广播发送出去。

(2)发送有序广播
广播是一跨进程的通信方式,在我们应用程序内发出的广播,其他应用程序应该也是可以收到的。发送有序广播的方法和标准广播类似,只不过将sendBroadcast()方法改为sendOraderBroadcast()方法,传入两个参数:第一个为Intent实例,第二个参数为与权限相关的字符串,可以传入null。
我们知道有序广播有先后顺序,即要设定优先级,因此在AndroidManifest/<receiver>/<intent-filter>标签的<>内添加属性priority。

<intent-filter android:priority=100>
	<action…>
</intent-filter>

如果在广播接收器的onReceive方法中调用了abortBroadcast()方法,就表示把这条广播截断,后面的广播接收器将无法接收到该条广播。

四、使用本地广播

除了发送和接收可以被其他任何应用程序接收的系统全局广播外,Android还引进了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播,这样就保证了应用程序使用的安全性。 使用方法:

  1. 新建一个广播接收器类,LocalReceiver,并在其中重写onReceive方法。
  2. 在活动中使用LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this)获取一个本地广播管理器的实例。
  3. 接下来与动态注册广播接收器类似:在onCreate方法中创建一个IntentFilter的实例,并且调用addAction()给它添加发出的广播值。
  4. 创建LocalReceiver实例localreceiver。
  5. 让localBroadcastManager调用registerReceiver (localReceiver,intentFilter)注册本地广播接收器。
  6. 发送广播时,由LocalBroadcastManager对象调用sendBroadcast()方法。

注意:本地广播无法通过静态注册的方式来接收。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值