广播实现的原理
Android中的广播使用了设计模式中的观察者模式:基于消息的发布 / 订阅事件模型

1.创建广播
继承BroadcastReceiver,重写onReceive方法,onReceive方法为接收到广播的回调方法,从intent可以获取传来的数据。
public class MyBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
2.注册方式
(1)代码中动态注册
代码调用registerReceiver()方法,传入广播和过滤器intentfilter
//new出上边定义好的BroadcastReceiver
MyBroadCastReceiver yBroadCastReceiver = new MyBroadCastReceiver();
//实例化过滤器并设置要过滤的广播
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
//注册广播
myContext.registerReceiver(smsBroadCastReceiver,intentFilter,
"android.permission.RECEIVE_SMS", null);
(2) 在Manifest.xml中静态注册
<receiver android:name=".MyBroadCastReceiver">
<!-- android:priority属性是设置此接收者的优先级(从-1000到1000) -->
<intent-filter android:priority="20">
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
两种注册广播的区别
动态注册广播跟随程序的生命周期。
静态注册是常驻型,即便是应用没有启动,如果有信息广播来,程序也会被系统调用自动运行。
广播发送方式
1.无序广播
sendBroadcast(intent)默认发送方式。
2.有序广播
sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)和每个接收者设置优先级,receiver设置prority属性高的优先收到广播,就可以在小于自己优先级的接收者得到广播前,修改或终止广播。
广播的类型
1 普通广播(Normal Broadcast)
开发者自身定义 intent的广播
2 系统广播(System Broadcast)
Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播
系统操作 action
监听网络变化 android.net.conn.CONNECTIVITY_CHANGE
关闭或打开飞行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
充电时或电量发生变化 Intent.ACTION_BATTERY_CHANGED
电池电量低 Intent.ACTION_BATTERY_LOW
电池电量充足(即从电量低变化到饱满时会发出广播 Intent.ACTION_BATTERY_OKAY
系统启动完成后(仅广播一次) Intent.ACTION_BOOT_COMPLETED
按下照相时的拍照按键(硬件按键)时 Intent.ACTION_CAMERA_BUTTON
屏幕锁屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
设备当前设置被改变时(界面语言、设备方向等) Intent.ACTION_CONFIGURATION_CHANGED
插入耳机时 Intent.ACTION_HEADSET_PLUG
未正确移除SD卡但已取出来时(正确移除方法:设置--SD卡和设备内存--卸载SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL
插入外部储存装置(如SD卡) Intent.ACTION_MEDIA_CHECKING
成功安装APK Intent.ACTION_PACKAGE_ADDED
成功删除APK Intent.ACTION_PACKAGE_REMOVED
重启设备 Intent.ACTION_REBOOT
屏幕被关闭 Intent.ACTION_SCREEN_OFF
屏幕被打开 Intent.ACTION_SCREEN_ON
关闭系统时 Intent.ACTION_SHUTDOWN
重启设备 Intent.ACTION_REBOOT
3 有序广播(Ordered Broadcast)
发送出去的广播被广播接收者根据优先级按照先后顺序接收
4 粘性广播(Sticky Broadcast)
粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果没有处理器接收消息,则消息会一直在消息容器里面等待。
本地广播(LocalBroadcastReceiver)和全局广播的差别
LocalBroadcastReceiver仅在自己的应用内发送接收广播,也就是只有自己的应用能收到,数据更加安全,而且效率更高。本地广播只能代码中动态注册,不能静态注册。
广播会引起ANR吗?
在广播的onReceive()方法中,生命周期为10秒,如果10秒还没有执行完,就会认为是ANR。所以,在广播的onReceive()中不能做耗时操作。
网友评论