关于BroadCastReceiver的总结

作者: 奔跑吧李博 | 来源:发表于2018-12-28 11:05 被阅读11次
广播实现的原理

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()中不能做耗时操作。

相关文章

网友评论

    本文标题:关于BroadCastReceiver的总结

    本文链接:https://www.haomeiwen.com/subject/cantzftx.html