(学习参考书:第一行代码第2版)
一、广播机制简介
Android中的广播可以分为两种类型:标准广播和有序广播;
标准广播:是一种完全异步执行的广播,在广播发出后,所有的广播接收器都会在同一时刻接收到这条广播。这种广播效率高,但是它无法被切断。
有序广播:是一种同步执行的广播,在广播发出后,同一时刻只有一个广播接收器能接收消息,当这个接收器的逻辑执行完毕后,广播才会继续传递。此时的广播接收器有先后顺序,优先级高的广播接收器先收到广播消息,且前面的广播接收器还可以截断正在传递的广播。
二、接收系统广播
(1)动态注册
广播接收器可以自由的对自己感兴趣的广播进行注册,这样当有相应广播发出时,广播接收器就能够接收到该广播,并在内部处理相应的逻辑。注册广播的方式一般有两种:在代码中注册(动态注册)、在AndroidManifest.xml中注册(静态注册)。
创建一个广播接收器的方法:新建一个类,让其继承BroadcastReceiver,并重写父类的onReceive()方法。
当有广播到来时,onReceive()方法会得到执行,具体的逻辑就可以在该方法中处理。
动态注册具体实现方法:
- 在活动定义一个类,继承BoradcastReceiver,重写父类的onReceive()方法。即创建广播接收器。
- 在onCreate方法中创建一个IntentFilter的实例,并且调用addAction()给它添加有一个值,这个值就是系统发出的广播。即广播接收器想要监听什么广播,就要添加相应的action。
- 注册广播接收器的实例。
- 调用registerReceiver()方法,传入广播接收器和IntentFilter的实例,这样当广播接收器接收到指定值的广播时,就会执行onRecevie方法
- 动态注册的广播接收器都要取消注册才行,可以在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)发送标准广播
- 定义一个广播接收器。
- 如果选择静态创建,在AndroidManifest//标签下添加自定义的action。
- 在发出广播的活动中创建Intent,构造方法传入参数与第2点添加的action一致。
- Intent对象调用setComponent(new ComponentName(“广播接收器包路径”,”广播接收器类的路径”))方法。
- 调用sendBroadcast(intent)方法将广播发送出去。
(2)发送有序广播
广播是一跨进程的通信方式,在我们应用程序内发出的广播,其他应用程序应该也是可以收到的。发送有序广播的方法和标准广播类似,只不过将sendBroadcast()方法改为sendOraderBroadcast()方法,传入两个参数:第一个为Intent实例,第二个参数为与权限相关的字符串,可以传入null。
我们知道有序广播有先后顺序,即要设定优先级,因此在AndroidManifest/<receiver>/<intent-filter>
标签的<>内添加属性priority。
<intent-filter android:priority=”100”>
<action…>
</intent-filter>
如果在广播接收器的onReceive方法中调用了abortBroadcast()方法,就表示把这条广播截断,后面的广播接收器将无法接收到该条广播。
四、使用本地广播
除了发送和接收可以被其他任何应用程序接收的系统全局广播外,Android还引进了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播,这样就保证了应用程序使用的安全性。 使用方法:
- 新建一个广播接收器类,LocalReceiver,并在其中重写onReceive方法。
- 在活动中使用LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this)获取一个本地广播管理器的实例。
- 接下来与动态注册广播接收器类似:在onCreate方法中创建一个IntentFilter的实例,并且调用addAction()给它添加发出的广播值。
- 创建LocalReceiver实例localreceiver。
- 让localBroadcastManager调用registerReceiver (localReceiver,intentFilter)注册本地广播接收器。
- 发送广播时,由LocalBroadcastManager对象调用sendBroadcast()方法。
注意:本地广播无法通过静态注册的方式来接收。