有两种:
(1)标准广播:是一种完全异步执行的广播,在广播发出去后,所有广播接收器几乎都会在同一时间内收到这条广播消息,多个接收器之间没有先后顺序的区别。
广播的效率较高,也是无法被截断的。
(2)有序广播:是一种同步的广播,同一时刻只会有一个广播接收器能够收到这条消息。 当这个广播接收器中的逻辑执行完成后,广播才会继续传播。
所以是有先后顺序的,优先级高的广播可以先收到广播消息,并且前面的广播接收器可以截断正在传递的广播,这样后面的接收器就无法收到广播消息了。
Android内置了很多系统级别的广播,比如:
(1)手机开机广播消息
(2)电池电量发生变化广播消息
(3)时间或时区发生改变广播消息
广播接收器可以对自己感兴趣的广播进行注册(收听)
(1)静态注册: 在AndroidManifest.xml中进行注册
优点:可以在未启动时接收广播,比如可以接收系统开机广播
缺点:不够灵活,只能注册全局广播,不能注册本地广播(其实也没有必要)
举例:
//注册广播处理类名
(2)动态注册:在代码中动态注册,比如在onCreate()中注册,但是必须要及时取消注册,比如在 onDestroy() 方法中。
优点:可以自由的控制注册与注销, 很灵活
缺点:必须在启动程序后才能接收到广播,无法在未启动时接收广播。
举例: 动态注册监听网络变化
onCreate(){
....
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTTIVITY_CHANGE"); //系统内置的广播消息
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter); //动态注册监听网络变化
}
onDestroy(){
...
unregisterReceiver(networkChangeReceiver); //取消注册
}
2.2 如何创建一个广播接收器
新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法即可(把具体的逻辑写在这里), 有广播到来时,这个方法就会被执行
class NetworkChangeReceiver extends BoradcastReceiver{
onReceive(Context context, Intent intent){
//获取系统服务用于管理网络连接
ConnecttivityManager connectionManager = (ConnecttivityManager)getSystemSerivce(Context.CONNECTTIVITY_CHANGE); //获取系统服务API
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isAvailable()){
Toast.makeText(context, "network changes, network is avaiable.", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "network changes, network is unavaiable.", Toast.LENGTH_SHORT).show();
}
}
【注意】:
(1)APP要访问一些关键系统信息,需要在AndroidManifest.xml中声明需要使用的权限
(2)在onReceive()方法中不要写过多的逻辑,也不要进行任何较耗时的操作,因为在广播接收器中是不允许开启线程的
一般情况在在接收器中去打开程序的其它组件,比如创建一条状态栏通知,或者启动一个服务等
(1)先定义接收器逻辑2.4 发送有序广播//注册广播处理类名 继承并重写onReceive()方法 onReceive(Context context, Intent intent){ Toast.makeText(context, "received in MyBroadcastReceiver.", Toast.LENGTH_SHORT).show(); } (2)定义发送广播消息逻辑 onCreate(){ button.setOnClickerListener( (View v)->{ Intent intent = new Intent("com.example.broadcast.MY_BROADCAST"); sendBroadcast(intent); //发送全局广播接口 } ) }
与标准广播的主要区别点:
(1)发送方:调用系统API接口不同,调用 sendOrderdBroadcast(intent, null); //第二个参数与权限有关的描述
(2)接收方:
//注册广播处理类名 //定义优先级,数字越大,优先级越高
(3)截断广播消息继续传递
只要广播接收者调用 abortBroadcast()接口即可。
本地广播的好处: 本地广播只能在APP内部进行传递,并且广播接收器也只能接收来自本应用发出的广播,安全性较高。
本地广播不能通过静态方式注册来接收,因为发送本地广播时,APP时肯定已经启动了,所以也完全不需要使用静态注册的功能。
本地广播通过LocalBroadcastManager进行管理
举例如下: 自己发,本地自己处理的场景
onCreate(){
...
localBroadcastManager = LocalBroadcastManager localBroadcastManager.getInstance(this); //获取实例
...
button.setOnClickerListener(
(View v)->{
Intent intent = new Intent("com.example.broadcast.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent); //发送本地广播接口
}
)
interFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter); //注册本地广播监听器
}
onDestroy(){
localBroadcastManager.unregisterReceiver(localReceiver); //取消注册本地广播监听器
}
//定义接收器处理类
class LocalReceiver extends BroadcastReceiver{
@override
publicvoid onReceive(Context context, Intent intent){
Toast.makeText(context, "received local broadcast.", Toast.LENGTH_SHORT).show();
}
}



