关于广播
一、什么是广播接收者?
安卓的四大组件之一,分为发送者和接收者。是一个全局监听器。可以接收系统广播,也可以接收应用广播,你可以选择过滤掉你不想接收的消息,只接收你想接收的,然后做出响应。
应用的场景:应用内或者不同应用之间、多线程通信、或者说与系统的通信,比如电话接入,网络可用时
原理:使用了观察者模式,所以安卓让广播的发送和接受进行解耦,方便集成,更易扩展。
二、广播有5种分类:
普通广播:这个很简单,就是用intent发送标识,在处理广播那里进行过滤接收。
系统广播:可以接收到如电量过低、锁屏、插入耳机、监听网络变化等等
有序广播:发送的广播被广播接收者按先后顺序接收,根据Priority值大小接收,如果Priority值相同
动态注册的广播优先接收。它的特点是可以拦截广播或者修改广播,用来控制下一个广播接受者。
粘性广播:在安卓5.0中已经失效,不建议使用。
App应用内的广播:广播发送者和接收者同属一个App,它相比于普通广播更安全高效。
二、注册方式
作为Android四大组件之一的广播有两种注册方式:静态注册和动态注册。在注册之前,我们应该有自己的
BroadcastReceiver,即广播接收器,这样我们才能接收到广播,进行事务处理。
public class MyBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context,Intent intent) {
// 在此处处理事务
}
}
1、静态注册
指的是在AndroidManifest.xml中用<receiver>标签进行注册,并在标签内用<intent-filter>标签设置过滤器,
例如<action>、<data>等。
<receiver android:name=".MyBroadCastReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.PACKAGE_REMOVED"/>
<dataandroid:scheme="package"/>
</intent-filter>
</receiver>
2、动态注册
指的是在代码中进行注册,例如:
IntentFilter:负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进行处理
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addDataScheme(“package”);
3、两种注册方式的区别和优缺点:
动态注册:生命周期与程序的生命周期一致,程序关闭后将接收不到广播。
静态注册:即使程序关闭也能接收到广播。
4、两种注册方式的优缺点:
动态注册:
(1)优点:优先级高于静态注册,优先收到广播。
(2)缺点:注册广播的Activity关闭,广播也将无法接收。
静态注册:
(1)优点:无需担心广播接收器是否被关闭,应用若未运行,将会被唤醒并接收广播。
(2)缺点:优先级较低。
三、广播的使用的注意事项
1、需要注意在自定义类继承于广播接受者时,在其回掉的onReceive()方法中,不可以做耗时操作,否则会产生ANR
2、在动态注册时,当不再需要广播接收器时,要记得注销unregisterReceiver(),否则可能引起内存泄露。
3、不可以重复的注册和注销
4、建议在onResume注册和在onPause方法中注销。可以防止内存泄漏,因为它在Activity销毁之前注销;