广播接收者BroadcastReceiver(2018年5月18日)
前提知识
ContextCompat上下文兼容
ContextCompat.getDrawable
ContextCompat.getColor
替代
context.getResources().getDrawable
context.getResources().getColor
import android.Manifest;
Manifest.permission.RECEIVE_SMS
1、广播接收者
BroadcastReceiver
使用场景:
当手机没有电时,会告知用户“电量低”的广播信息。可以做到正在使用的app就会接收到这个广播消息,如果是游戏可能是提醒保存数据,如果是正在使用的工作软件,可能提醒接上电源。
对于某某程序来说,可以选择接收这一消息也可以选择不接收这个消息。
手机的storage不够了,提示你清理空间,否则应用程序将变慢或者无法使用。
手机一开机,某某程序就自动运行,QQ、微信都是开机自启。
原理:
一个程序发出广播信息,一个程序接收广播信息,所以至少需要2个程序才能完成一发一收。发的一方,叫广播发送方;收的一方,叫广播接收者。
例如使用receiver可以接收短信拦截它。
如何实现:
(1)接收什么广播
是指广播的消息是什么,需要接收者关注什么广播频道
(2)接收到广播后做什么?
重写onReceive()方法,表示收到广播就做什么
(3)需要定义一个继承于BroadcastReceiver的类。
【案例】收到短信,响应它。
步骤:
(1)继承BroadcastReceiver,重写onReceive方法
(2)注册BroadcastReceiver,且设置广播的action
(3)权限的设置,分为动态权限和静态权限
项目结构:
MyReceiver.java
AndroidManifest.xml
MainActivity.java
测试:
Log日志:
2、有关广播接收者的分类
有关广播:按是否有序分类:有序广播和无序广播
有序广播是指:接收者A收到广播后传给B,B传给C,有序传递。任何一个环节都可以终止广播,也可以修改广播中携带的数据。
发送广播的方法是:sendOrderedBroadcast()
无序广播是指:一个广播发送者,向所有接收者同时发送广播,也就是ABC接收者都同时响应。
发送广播的方法是:sendBroadcast()
有关广播接收者:按是否常驻分类:常驻型广播接收者和非常驻型广播接收者
常驻型广播接收者:在androidManifest.xml中注册,只要应用程序没有被卸载就持续存在。
非常驻型广播接收者:在java代码中注册,一般随Activity或者Service组件产生而产生,随他们销毁而销毁。生命周期比较短。使用的方法是registerReceiver(参数1:广播接收者实例,参数2:频道(意图过滤器));unregisterReceiver(广播接收者实例)
3、如何发送广播?
实现的步骤:
(1)需要设置一个意图,意图中包含广播的频道,也就是有action,这个action相当于广播中的频道,关联了收和发广播双方,发从什么频道发出去,收从什么频道接收来。
(2)使用sendBroadcast(intent),表示发送广播。
Sender Module:
activity_main.xml
MainActivity.java
Receiver Module:
MyReceiver.java
androidManifest.xml
效果:
点击
在receiver中显示日志
日志为:
4、如何发送有序广播?
有序广播,又叫同步广播,接收者依次收到广播,这个顺序取决于接收者在注册时设置priority(优先级),该数字越大表示优先级越高,代表越先收到广播。有序广播对于接收者来说,效率较低,因为有先后顺序。
无序广播,异步执行,各自执行各自的响应,互相不干扰,效率较高。
Sender Module:
修改activity_main.xml
修改MainActivity.java
Receiver Module:
MyOrderedReceiver1.java
MyOrderedReceiver2.java
MyOrderedReceiver3.java
androidManifest.xml
测试:
点击发送有序广播,依次响应。
注意:
(1)如果多个接收者priority一样,在前面注册的先接收消息,先做出响应
(2)也可以在某个receiver上终止广播,后面的receiver就收不到消息了。使用abortBroadcast()方法。
5、如何在有序广播中传递数据?
发送有序广播时需要指定参数
public abstract void sendOrderedBroadcast(Intent intent, String permission, BroadcastReceiver receiver, Handler handler, int code, String data, Bundle bundle);
intent,通过意图,指定广播的频道
permission,表示必须具备什么权限才能接收的接收者,null表示不需要限定权限
receiver,指定某一个接收必须接收(即使碰到abortBroadcast,也接收)
handler,系统的处理者,实现线程通信
code,表示广播的状态码
data,表示原始数据,可以用于传递数据
bundle,是一组数据,可以包含很多数据
【案例】发送带有数据的广播
sender2 module:
activity_main.xml:
MainActivity.java
Receiver2 Module:
MyReceiver1.java
MyReceiver2.java
MyReceiver3.java
AndroidManifest.xml
效果:
依次收到数据
6、发送有序广播中,修改传递的数据
在接收者中调用setResultData(String)方法对字符串数据进行修改;
在接收者中调用setResultExtra(bundle)方法对bundle数据进行修改
sender3 Module:
activity_main.xml
MainActivity.java
Receiver3 Module:
MyReceiver1.java
MyReceiver2.java
MyReceiver3.java
在androidManifest.xml中注册。
测试如下:
【作业】
实现有序广播及接收者(2个),接收者根据广播信息传递不同数据,如广播消息“没有电了”,接收者1回应“保存数据,完成第一步”,接收者2回应“保存数据,完成第二步”。如果广播消息是“没有信号”,接收者1回应“连接基站,完成第一步”,接收者2回应“连接基站,完成第二步”。