BroadcastReceiver
BroadcastReceiver也是Android四大组件之一。顾名思义,是接收消息的组件。比如Android系统的一些事件,wifi状态,亮屏灭屏,开机等等,好多事件都会发出广播。比如wifi状态变化,当我们的app收到消息时,可以及时提醒用户从wifi切换到了手机流量。当然了,我们也可以在自己的app中发消息,并使用BroadcastReceiver来接收。由于发送者和接收者是相互独立的,所以可以做到夸线程,甚至夸进程收发。虽然可以有效的减少我们在夸进行线程间的麻烦,但是会使得机构十分松散,不容易维护。所以还是慎用。
1.收发
1.1发
context.sendBroadcast(intent);
这样就可以发送一个最简单的广播,需要构造intent,设置action等参数(是否设置其他参数根据需求)
1.2收
定义一个类,继承BroadcastReceiver,实现onReceive方法,方法中会传过来intent,这里我们可以对想关注的action进行过滤。注意,onReceive方法是在主线程,不能执行耗时操作
最简单的收发就是这么简单,当然,如果有需求的话,还可以发送有序广播,也就是说广播的接收是有顺序的,并且可以在每一个顺序节点上对intent携带的内容进行修改。
2.注册
BroadcastReceiver也是Android的四大组件之一,所以也需要配置在AndroidManifest.xml中(静态注册)。
但是比较特殊的事,BroadcastReceiver也可使用代码配置(动态注册)
二者的区别是:静态注册,无论app是否在运行,只要有满足了onReceive条件的广播,就会启动组件。动态注册,只在注册的有效期内会响应onReceive。
上面提到了有效期,注意,动态注册的方式,一定要及时解注册,否则可能造成内存泄漏
3.安全
安全问题也从两个角度出发,一个收,一个发
3.1发
如果你的广播只是在本app中使用,不希望被其他app收到,可以考虑使用sendLocalBroadcast
如果你的广播需要发送到其他app,可以给intent设置package,这样就会指定目标应用。为了进一步安全,你还可以设置权限,只有设置了响应权限的应用才能接受
3.2收
如果你的广播接收者只需要响应本app的广播,可以设置exported属性,表示不响应外部广播。
如果你的广播接收者需要响应其他app的广播,可以使用上面提到的,配置权限