Broadcast广播消息

1、广播信息
             在 Android中,Broadcast是一种广泛运用在应用程序之间异步传输信息的机制。Android系统通过发出广播消息,来通知各应用组件一些系统事件,如地域变换、电量不足、来电信息等,这些消息通常称为系统消息。第三方应用也可以广播消息,这些消息称为自定义消息。广播消息在本质上就是一个Intent对象。
            
             BroadcastReceiver用于接收并处理广播消息。不管是系统消息还是自定义消息,都可以通过BroadcastReceiver来进行处理。形象的比喻,Intent是一种一对一的通信,广播消息是一种一对多的通信。
 
2、 广播消息的处理流程
            对于广播消息的处理,大致要经过消息发送、BroadcastReceiver注册和消息处理三个环节。
 
3、消息发送
            广播消息的实质就是一个Intent对象。使用sendBroadcast()或sendStickyBroadcast()方法发出去的Intent,所有满足条件的BroadcastReceiver都会随机地执行其onReceive()方法;而sendOrderBroadcast()发出去的Intent,会根据BroadcastReceiver注册时Intent Filter 设置的优先级的顺序来执行,相同优先级的BroadcastReceiver则是随机执行。sendStickyBroadcast()方法主要的不同的是,Intent在发送后一直存在,并且在以后调用registerReceiver注册相匹配的BroadcastReceiver时会把这个Intent直接返回。
4、注册BroadcastReceiver
             注册BroadcastReceiver有两种方式:
             一种方式是,静态地在AndroidManifest.xml中用<receiver>标签声明,并在标签内用<intent-filter>标签设置过滤器
              另一种方式是,动态在代码中先定义并设置好一个Intent Filter 对象,然后再需要注册的地方调用Context.registerReceiver(BroadcastReceiver,intentFilter)方法,如果取消时就调用Context.unregisterReceiver(BroadcastReceiver)方法。如果用动态注册BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。根据Activity组件的生命周期,通常在onResume中注册BroadcastReceiver,在onPause中取消BroadcastReceiver。
5、处理消息
             当广播消息发送以后,所有已经注册的BroadcastReceiver会检查注册时的Intent Filter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用标记<uses-permission>声明了拥有此权限的BroadcastReceiver才会有可能接收到发送来的Broadcast。
            
             一个BroadcastReceiver可以处理多个广播消息,具体做法为在onReceive()方法调用Intent参数的getAction判断传进来的动作,即可进行不同的处理。
6、处理系统广播消息
              在广播消息中,有一类特殊的广播消息,它们特殊在只能由Android系统发出,这类广播消息称为系统广播。
 
             ACTION_TIME_TICK  系统时间已经改变。该事件每分钟被广播一次,只能通过动态注册BroadcastReceiver来响应。
             ACTION_TIME_CHANGED  系统时间被设置
             ACTION_TIMEZONE_CHANGED  系统时区被改变
             ACTION_BOOT_COMPLETED    系统启动完成
             ACTION_PACKAGE_ADDED    新的应用程序被安装
             ACTION_PACKAGE_CHANGED  应用程序被改变
             ACTION_PACKAGE_REMOVED  应用程序被卸载
             ACTION_PACKAGE_RESTARTED  应用程序被重新启动
             ACTION_PACKAGE_DATA_CLEARED  应用程序数据被清空
             ACTION_UID_REMOVED  用户ID被删除
             ACTION_BATTERY_CHANGED 点量信息改变
             ACTION_POWER_CONNECTED  外接电源被连通
             ACTION_POWER_DISCONNECTED 外接电源被断开
             ACTION_SHUTDOWN    系统关闭
 
            静态注册BroadcastReceiver 很简单,需要在AndroidManifest文件中增加一个receiver节点,并且在节点中嵌套一个intent-filter来声明组件响应的Intent对象的属性,在autorun例子中,为系统广播 android.intent.action.BOOT_COMPLETED的应用权限的声明。
 
7、深入消息处理
             广播消息的发送方式由多种:
             无序广播
             有序广播
             持续广播
8、BroadcastReceiver的生命周期
            BroadcastReceiver的onReceive()方法执行完成后,BroadcastReceiver的实例就会被销毁。如果onReceive()方法在10s内没有执行完毕,Android会认为改程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否则会弹出“Application NoResponse”对话框。特别说明的是,这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。BroadcastReceiver一旦结束,此时它所在的进程很容易在系统需要内存时被优先杀死,因为它属于空进程。
 
        总结:注册的方式由静态注册和动态注册两种。对于有序消息,动态注册的BroadcastReceiver总是先于静态注册的BroadcastReceiver被触发。对于同样是动态注册的BroadcastReceiver,优先级别高的将先被触发,而静态注册的BroadcastReceiver总是按照静态注册的顺序执行。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值