一、Android引入广播的意义
Android广播机制最大的特点是只管发送,不管有没有接收,也不管接收方怎么处理数据,这是它与普通方法的区别。事实上,Android广播机制是为了解决跨进程通讯。而这一点是直接调用方法所不能实现的。例如,电量变化,很多应用要根据这个改变来作出相应操作,而在最初设计时,我们是不可能知道所有这些应用的,也就无法进行逐个实例化对象,不能直接调用方法,这时广播机制的作用就体现出来了。
由于android系统中应用程序之间不能共享内存,因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。Android广播有两种类型,一种是程序内的,一种程序间的。程序内的广播体现不出其真正意义。而程序间的广播,比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项,这些才是其真正的用途。Android广播一般用于一个程序告诉另一个程序,某些信息改变了,发生变化了,需要作出相关的应对,并不管有哪些程序接收到这些信息。
二、两种注册广播方式:
1.常驻型广播(静态注册)
常驻型广播,当应用程序关闭了,如果有广播信息来,写的广播接收器同样的能接收到,它的注册方式就是在应用程序的AndroidManifast.xml 中进行注册。这种方式可以理解为通过清单文件注册的广播是交给操作系统去处理的。示例代码如下:
<!--广播注册、name里面填写广播类的路径-->
<receiver android:name=".SmsBroadCastReceiver">
<intent-filter android:priority="20">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
使用场景:开机自启动的实现
优点:不受应用生命周期的影响,常驻
缺点:常驻会耗费cpu、电量等资源
2.非常驻型广播(动态注册)
非常驻型广播,当应用程序结束了,广播自然就没有了,比如在 Activity 中的 onCreate 或者 onResume 中注册广播接收者,在 onDestory 中注销广播接收者。这样广播接收者就一个非常驻型的了,这种注册方式也叫动态注册。这种方式可以理解为通过代码注册的广播是和注册者关联在一起的。示例代码如下:
//定义广播
class SmsReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//doSomething
}
}
//注册广播
private SmsReceiver smsReceiver;
smsReceiver=new SmsReceiver();
IntentFilter intentFilter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(smsReceiver,intentFilter);
//发送广播
Intent intent=new Intent();
intent.setAction("android.provider.Telephony.SMS_RECEIVED");
sendBroadcast(intent);
使用场景:更新UI等及时性通信操作
优点:在Android的广播机制中,动态注册的优先级高于静态注册的优先级,因此在必要情况下,我们需要动态注册广播接收器。取消注册后,不再占用资源
缺点:程序退出,注销广播后,便无法进行广播监听