BroadcastReceiver,广播接收者。Android四大组件之一,它的本质就是一个全局的监听器。可以监听到开机、锁屏、解锁、电话短信、电量变化、网络等系统性广播,以及应用广播,用来实现不同组件之间的通信
在Android中,广播可以分为两大类:标准广播(Normal broadcasts)和有序广播(Ordered broadcasts)
标准广播
也称“普通广播”、“无序广播”,一种异步执行的广播。在广播发出后,只要匹配条件的广播接收者都可以接收到广播。这种广播效率很高,但是没有先后顺序(几乎同时收到),所以不可以被拦截,不可以被终止,不可以被修改
sendBroadcast()
有序广播
有序广播,是一种同步执行的广播。在广播发出后,从优先级别最高的广播接收器开始接收,当这个广播接收器中的逻辑执行完成以后,如果没有丢弃,就下传给下一个次高优先级别的广播接收器进行处理,依次类推,直到最后。如果多个应用程序设置的优先级别相同,则谁先注册的广播,谁就可以优先接收到广播。有序广播可以被终止,数据可以被修改
sendOrderedBroadcast()
在Android中,广播的注册方式可以分两种:动态注册和静态注册(静态注册的广播也称常驻性广播)
创建一个广播接收者 TestReceiver
class TestReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO 逻辑处理
}
}
静态注册广播
TestReceiver 作为外部类,在 AndroidManifest.xml文件中进行注册
1.在 AndroidManifest.xml中声明广播接收者
<receiver android:name=".receiver.TestReceiver">
//指定广播意图action,用于过滤广播
<intent-filter>
<action android:name="android.intent.action.test_receiver" />
</intent-filter>
</receiver>
2.在TestReceiver 中onReceive()方法中功能需求进行相应的逻辑处理
3.在使用静态方式注册广播时,每次接收到广播时,都会重新创建TestReceiver对象,如果TestReceiver中有成员变量,变量的值都会重新为默认值
public final static String ACTION_TEST_RECEIVER ="android.intent.action.test_receiver";
class TestReceiver extends BroadcastReceiver {
public List<String> data;
@Override
public void onReceive(Context context, Intent intent) {
// TODO 逻辑处理
//在这里判断data是否为null ,其实是没有什么用的,每次接收到广播时,data都会为null
if (data == null) {
data = new ArrayList<>();
}
}
//发送广播
Intent intent =new Intent();
intent.setAction(ACTION_TEST_RECEIVER);
//传递数据
intent.putExtra("name","数据");
sendBroadcast(intent);
如果不想TestReceiver中的成员变量值重置,我们可以用关键词 static 修饰变量,但是这样存在一个问题,就是成员变量一直占用着内存,所以我们需要做相应的处理
class TestReceiver extends BroadcastReceiver {
//用 static 修饰data
public static List<String> data;
@Override
public void onReceive(Context context, Intent intent) {
// TODO 逻辑处理
if (data == null) {
data = new ArrayList<>();
}
}
// 置空数据
public void clearData() {
data = null;
}
}
动态注册广播
TestReceiver 作为为内部类,
1.在代码中实例化注册
public final static String ACTION_TEST_RECEIVER ="android.intent.action.test_receiver";
private TestReceiver receiver ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_receiver);
//在onCreate()注册,这个并不是一定要在这里注册,根据自己的实际需要
receiver = new TestReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_TEST_RECEIVER);
registerReceiver(receiver, filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//注意注册了广播,一定要销毁,否则会出现有异常
if (receiver != null) {
unregisterReceiver(receiver);
}
}
//发送广播
Intent intent =new Intent();
intent.setAction(ACTION_TEST_RECEIVER);
//传递数据
intent.putExtra("name","数据");
sendBroadcast(intent);
2.在TestReceiver 中onReceive()方法中功能需求进行相应的逻辑处理
无论是有序广播还是无序广播都属于系统的全局广播,我们发出的这些广播可以给系统中任何应用程序接收到,当然我们也可以接受其他应用程序的广播。考虑到对单个应用程序而言广播是存在安全性问题的,android系统提供了本地广播机制(LocalBroadcastManager ),发出的广播只能在本应用程序中接收到
LocalBroadcastManager mManager= LocalBroadcastManager.getInstance(this);
TestReceiver receiver = new TestReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_TEST_RECEIVER);
//注册广播
mManager.registerReceiver(localReceiver, filter );
//取消注册
mManager.unregisterReceiver(localReceiver);
//发送广播
Intent intent =new Intent();
intent.setAction(ACTION_TEST_RECEIVER);
//传递数据
intent.putExtra("name","数据");
mManager.sendBroadcast(intent);
BroadCastReceiver的生命周期
BroadcastReceiver的生命周期,从对象调用它开始,到onReceiver方法执行完成之后结束。另外,每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作
注意问题
1.一个广播使用了静态注册和动态注册,则会注册两次广播接收者。
2.当发送广播被不想被除应用第三方接收时,应该给broadcast发送方设置permission权限。
3.当自己广播接收器需要过滤特定广播来源时,需要给广播接收器设置intent-filter指定接收广播的类型。
4.onReceive()方法运行在主线程,不能做耗时的操作,否则会导致主线程阻塞,需要处理耗时操作时可以通过启动一个service进行处理。
5.使用动态注册的方式,退出销毁activity时,要取消注册广播
6.当接收到广播时,会重新创建BroadcastReceiver对象,回调onReceive()函数,之后BroadcastReceiver对象将被销毁。