Android四大组件分别为Activity(活动)、Service(服务)、Broadcast Receiver(广播接收者)、Content Provider(内容提供者)
广播是android中在应用程序间传递消息的机制,而要过滤并取得广播中的消息就需要用到Broadcast Receiver,可以监听广播消息并实现不同组件的通信。
如果手写一个类继承BroadcastReceiver的话,同样需要在清单文件中注册
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true"></receiver>
上述为静态注册,广播接收者还可以动态注册,即在Activity中直接注册,但是当Activity销毁时,该广播接收者也销毁。
BroadcastReceiver的生命周期较短,因此不宜做一些耗时的操作,应该将耗时操作交给Service去完成。
无序广播、有序广播、本地广播、粘性广播
1.无序广播
无序广播是异步执行的,发送广播时,所有能接收的广播接收者都能接收到信息,顺序不定,但效率较高且无法被拦截。
//发送方法一
MyReceiver myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);//设置点亮屏幕是事件监听
registerReceiver(myReceiver, filter);
//关闭广播
unregisterReceiver(myReceiver);
//发送方法二
Intent intent = new Intent(Intent.ACTION_SCREEN_ON);
sendBroadcast(intent);
在MyReceiver中可设置对应操作:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "点亮了屏幕", Toast.LENGTH_SHORT).show();
}
}
2.有序广播
有序广播是同步执行的,接收者按照申明的优先级来确定依次接收的顺序,当一个广播接收者接收到信息并且处理完之后,该广播才会继续传播给其他优先级低的接收者,顺序确定,但效率较低并且可被拦截。
广播优先级的设置 在清单文件中注册广播接收者时,在
标签中设置priority的值:
值为整数,值越大优先级越高,如果两个广播接收者的优先级相同,则看哪个广播接收者先注册,不同程序监听同个广播的话,若优先级相同,则看哪个程序先安装。
Intent intent = new Intent(Intent.ACTION_SCREEN_ON);
sendOrderedBroadcast(intent,null);//第二个参数为接收者需要的权限
还可以如下发送有序广播,可用于指定某个广播接收者必定收到广播:
sendOrderedBroadcast(Intent intent,
String receiverPermission,//接收者需要的权限
BroadcastReceiver resultReceiver,//该广播接收者是最终一定会执行的,即使广播被拦截或者终止。
Handler scheduler,
int initialCode,
String initialData,
Bundle initialExtras);
在广播接收者中拦截广播:
abortBroadcast();//拦截广播
在广播接收者中还可以修改广播中的数据:
//获得数据
int code = getResultCode();
String data = getResultData();
Bundle bundle = getResultExtras(true);
//修改数据
setResultCode(666);
setResultData("666");
Bundle bundle = new Bundle();
bundle.putString("666", "666");
setResultExtras(bundle);
3.本地广播
上述广播是可以被全部对应的广播接收者接收,因此会被其他应用接收,可能会产生一些不安全的操作。本地广播机制发出广播后只能被该应用程序内部进行传播,广播接收者只能接收本应用程序内部的广播。
本地广播只能在代码中注册,且不能拦截
Intent intent = new Intent(Intent.ACTION_SCREEN_ON);
LocalBroadcastManager.getInstance(this).sendBroadcastSync(intent);
4.粘性广播
粘性广播发送后如果没有接收者接受处理,则会一直存在系统中等待处理。
粘性广播因为缺乏安全性,其他广播接收者可以随意访问和修改,会导致一些难以估计的问题,因此官方已经舍弃了。
sendStickyBroadcast(Intent intent);