zoukankan      html  css  js  c++  java
  • 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总是按照静态注册的顺序执行。
  • 相关阅读:
    QTdebug时没有调试引擎
    快速排序
    MFC之动态创建按钮
    Linux 本人常用到的基本命令
    history 查看历史操作记录在shell脚本执行中无法显示问题
    C#基础学习5
    C#基础学习4
    C#基础学习3
    C#基础学习1
    C#基础学习2
  • 原文地址:https://www.cnblogs.com/qingblog/p/2567716.html
Copyright © 2011-2022 走看看